Beim Schreiben eines Programms mit Pythons GUI (Tkinter), beim Erben der GUI-Klasse Auch variable Argumente werden ausnahmslos vererbt. Wenn Sie jedoch ein Argument in die geerbte Klasse einfügen, tritt in der geerbten Quelle ein Fehler auf, dessen Verwendung schwierig ist.
Beispielsweise kann die Schaltfläche Check von Tkinter nicht auf einen Anfangswert gesetzt werden. Ein Memorandum beim Erstellen einer Check-Schaltfläche, mit der Sie den Anfangswert festlegen können.
Wenn Sie es normal schreiben, wird es wie folgt sein.
NormalCheckbox
cv = tk.BooleanVar()
cb = tk.Checkbutton(self, parent, variable=cv)
cv.set(True) #Anfangswerteinstellung
Aber ich möchte so schreiben.
ShimplCheckbox
cb = tk.Checkbutton(self, parent, check=True)
Machen wir also SimpleCheck, indem wir tk.Checkbutton erben.
SimpleCheckbox.py
# Initial value = check=True or False
class SimpleCheck(tk.Checkbutton):
def __init__(self, parent, *args, **kw):
self.flag = kw.pop('check')
self.var = tk.BooleanVar()
if self.flag:
self.var.set(True)
self.txt = kw["text"]
tk.Checkbutton.__init__(self, parent, *args, **kw, variable=self.var)
def get(self):
return self.var.get()
Es gibt jedoch ein Problem mit diesem Code. Das Problem ist, dass Sie eine Fehlermeldung erhalten, wenn Sie das Argument "check" nicht angeben.
mainloop
if __name__ == '__main__':
app = tk.Tk()
sc1 = SimpleCheck(app, check=True, text="hoge")
sc1.pack()
sc2 = SimpleCheck(app)
sc2.pack()
print(sc1.getText())
print(sc1.cget('text'))#same result
app.mainloop()
error
Traceback (most recent call last):
File "arg_test.py", line 24, in <module>
sc2 = SimpleCheck(app)
File "arg_test.py", line 7, in __init__
self.flag = kw.pop('check')
KeyError: 'check'
Daher wird die Methode zum Extrahieren von Argumenten in der Vererbung mithilfe variabler Argumente als Memorandum angezeigt. Bei Verwendung des ternären Operators scheint die Verwendung von "pass" einen Fehler zu ergeben.
SimpleCheck.py
import tkinter as tk
# Check value :check=True or False (Default False)
# Label text :text=Keword
class SimpleCheck(tk.Checkbutton):
def __init__(self, parent, *args, **kw):
self.flag = kw.pop('check') if('check' in kw) else False
self.txt = kw['text'] if('text' in kw) else ""
self.var = tk.BooleanVar()
if self.flag:
self.var.set(True)
tk.Checkbutton.__init__(self, parent, *args, **kw, variable=self.var)
def get(self):
return self.var.get()
def getText(self):
return self.txt
if __name__ == '__main__':
app = tk.Tk()
sc1 = SimpleCheck(app, check=True, text="hoge")
sc1.pack()
sc2 = SimpleCheck(app)
sc2.pack()
print(sc1.getText())
print(sc1.cget('text'))#same result
app.mainloop()
Postscript @shiracamus gab mir einige Ratschläge Es scheint, dass der Anfangswert mit dem Pop-Second-Argument von Dic festgelegt werden kann, ohne den ternären Operator zu verwenden. Danke für deinen Rat.
diff
def __init__(self, parent, *args, **kw):
self.flag = kw.pop('check', False)
self.txt = kw['text'] if('text' in kw) else ""
Recommended Posts