使用 类 在 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()
- 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()
1 我说 应该 因为它不是 100% 清楚你想做什么。由于您最初进行导入的方式,不清楚您是打算使用 Checkbutton
小部件的 ttk 版本还是 tk 版本。这是导入 tkinter 时通配符导入不好的原因之一。如果你想使用 ttk checkbutton,你需要将这一行更改为:
self.cb = ttk.Checkbutton
我正在尝试使用 类 在 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()
- 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()
1 我说 应该 因为它不是 100% 清楚你想做什么。由于您最初进行导入的方式,不清楚您是打算使用 Checkbutton
小部件的 ttk 版本还是 tk 版本。这是导入 tkinter 时通配符导入不好的原因之一。如果你想使用 ttk checkbutton,你需要将这一行更改为:
self.cb = ttk.Checkbutton