im试图使用类在tktinter python中创建多个复选框,但是由于某些原因,这些复选框未显示,这是我得到的错误AttributeError: 'crop' object has no attribute 'tk'
这是我的代码
from tkinter import *
from tkinter.ttk import *
import tkinter as tk # python 3
screen = Tk()
class crop:
def __init__(self,sizename,sizevar,onvar):
sizevar= StringVar
self.tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
self.pack()
def main():
first = crop('2.5','twofive','twofiveon')
second = crop('3','three','threeon')
screen.mainloop()
main()
感谢您的提前帮助。
首先,您需要在调用mainloop
之后而不是之前调用main
。>>
第二,sizevar= StringVar
必须为sizevar= StringVar()
。
第三-这是引发错误的行-您正在尝试调用self.tk.Checkbutton
,但您的crop
对象尚未定义名为tk
的属性。我不确定您要完成什么,但是我想您只是在尝试调用tk检查按钮,这意味着代码应为tk.Checkbutton(...)
下一个问题是self.pack()
-self
是crop
对象。它不是小部件,因此没有pack
方法。看来您的意图是包装该复选框,因此您需要保存对该复选框的引用,然后在其上调用pack
(例如:self.cb = tk.Checkbutton(...); self.cb.pack()
)
另一个问题是您两次导入tkinter。您只应该执行一次。您需要同时删除from tkinter import *
和from tkinter.ttk import *
。然后,在引用tkinter和ttk对象时,请使用tk.
或ttk.
作为前缀。
最后一个问题是您没有遵循PEP8准则,这使其他程序员更难以理解您的代码。具体来说,crop
必须为Crop
。
将它们放在一起,您的代码应该
1
看起来像这样:import tkinter as tk
from tkinter import ttk
screen = tk.Tk()
class Crop:
def __init__(self,sizename,sizevar,onvar):
sizevar= tk.StringVar()
self.cb = tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
self.cb.pack()
def main():
first = Crop('2.5','twofive','twofiveon')
second = Crop('3','three','threeon')
main()
screen.mainloop()
我说应该,因为并不是100%清楚您想做什么。由于您最初是采用导入方式的,因此尚不清楚您打算使用1
Checkbutton
小部件的ttk版本还是tk版本。这是导入tkinter时通配符导入不正确的原因之一。如果要使用ttk复选按钮,则需要将该行更改为此:self.cb = ttk.Checkbutton