Lors de l'écriture d'un programme à l'aide de l'interface graphique de Python (Tkinter), lors de l'héritage de la classe GUI Les arguments variables sont également hérités sans exception. Cependant, si vous ajoutez un argument dans la classe héritée, une erreur se produira dans la source héritée et il sera difficile à utiliser.
Par exemple, le bouton Vérifier de Tkinter ne peut pas être défini sur une valeur initiale. Un mémorandum lors de la création d'un bouton Vérifier qui vous permet de définir la valeur initiale.
Si vous l'écrivez normalement, ce sera comme suit.
NormalCheckbox
cv = tk.BooleanVar()
cb = tk.Checkbutton(self, parent, variable=cv)
cv.set(True) #Réglage de la valeur initiale
Mais je veux écrire comme ça.
ShimplCheckbox
cb = tk.Checkbutton(self, parent, check=True)
Alors, faisons SimpleCheck en héritant de tk.Checkbutton.
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()
Cependant, il y a un problème avec ce code. Le problème est que si vous ne spécifiez pas l'argument "check", vous obtiendrez une erreur.
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'
Par conséquent, la méthode d'extraction des arguments dans l'héritage à l'aide d'arguments variables est présentée sous forme de mémorandum. Lors de l'utilisation de l'opérateur ternaire, l'utilisation de "pass" semble donner une erreur.
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 m'a donné quelques conseils Il semble que la valeur initiale puisse être définie avec le second argument pop de Dic sans utiliser l'opérateur ternaire. Merci pour votre conseil.
diff
def __init__(self, parent, *args, **kw):
self.flag = kw.pop('check', False)
self.txt = kw['text'] if('text' in kw) else ""
Recommended Posts