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

using classes to create checkboxes in tktinter python

我正在尝试使用 类 在 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()

提前感谢您的帮助。

您需要执行以下操作:

  def __init__(self,sizename,sizevar,onvar):
        global screen # or pass it as __init__ parameter
        sizevar= StringVar
        b= tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
        b.pack()

您的代码有几处错误。

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

其次,sizevar= StringVar需要为sizevar= StringVar()

第三 - 这是抛出错误的行 - 您正在尝试调用 self.tk.Checkbutton 但您的 crop 对象尚未定义名为 tk 的属性.我不完全确定你想要完成什么,但我的猜测是你只是想调用 tk checkbutton 这意味着代码应该是 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 checkbutton,你需要将这一行更改为:

self.cb = ttk.Checkbutton