使用类在tktinter python中创建复选框

问题描述 投票:0回答:2

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()

感谢您的提前帮助。

python oop tkinter widget tk
2个回答
0
投票
您的代码有几处错误。

首先,您需要在调用mainloop之后而不是之前调用main。>>

第二,sizevar= StringVar必须为sizevar= StringVar()

第三-这是引发错误的行-您正在尝试调用self.tk.Checkbutton,但您的crop对象尚未定义名为tk的属性。我不确定您要完成什么,但是我想您只是在尝试调用tk检查按钮,这意味着代码应为tk.Checkbutton(...)

下一个问题是self.pack()-selfcrop对象。它不是小部件,因此没有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()

1

我说应该,因为并不是100%清楚您想做什么。由于您最初是采用导入方式的,因此尚不清楚您打算使用Checkbutton小部件的ttk版本还是tk版本。这是导入tkinter时通配符导入不正确的原因之一。如果要使用ttk复选按钮,则需要将该行更改为此:self.cb = ttk.Checkbutton

-1
投票
您需要执行以下操作:
© www.soinside.com 2019 - 2024. All rights reserved.