Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用类在tktinter python中创建复选框_Python_Oop_Tkinter_Widget_Tk - Fatal编程技术网

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

使用类在tktinter python中创建复选框,python,oop,tkinter,widget,tk,Python,Oop,Tkinter,Widget,Tk,我试图使用类在tktinter python中创建多个复选框,但是由于某些原因,复选框没有显示出来,这就是我得到的错误 AttributeError:“裁剪”对象没有属性“tk” 这是我的密码 from tkinter import * from tkinter.ttk import * import tkinter as tk # python 3 screen = Tk() class crop: def __init__(self,sizename,sizevar,onvar

我试图使用类在tktinter python中创建多个复选框,但是由于某些原因,复选框没有显示出来,这就是我得到的错误 AttributeError:“裁剪”对象没有属性“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,但您的裁剪对象尚未定义名为tk的属性。我不完全确定您想要完成什么,但我猜您只是想调用tk checkbutton,这意味着代码应该是tk.checkbutton

下一个问题是self.pack-self是裁剪对象。它不是一个小部件,因此没有pack方法。似乎您的目的是打包checkbutton,因此您需要保存对checkbutton的引用,然后在其上调用pack,例如:self.cb=tk.checkbutton。。。;自助包

另一个问题是您要导入tkinter两次。你应该只做一次。您需要从tkinter导入*和tkinter.ttk导入*中删除这两个文件。然后,使用tk。或者ttk。作为引用tkinter和ttk对象时的前缀

最后一个问题是您没有遵循指导原则,这使得其他程序员更难理解您的代码。具体来说,作物必须是作物

综上所述,您的代码应该如下所示:

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%清楚。由于您最初进行导入的方式,不清楚您是打算使用Checkbutton小部件的ttk版本还是tk版本。这是导入tkinter时通配符导入不好的原因之一。如果要使用ttk checkbutton,需要将该行更改为:

self.cb = ttk.Checkbutton

这就取消了类的使用,我需要使用类来缩短我的代码,因为我将创建20个复选框,谢谢你的帮助,尽管没有。您需要确定要从每个crop实例中检索的内容,并使其成为类的属性,例如self.sizevar=StringVarim非常困惑,您能给我完整的代码吗?谢谢,他们不需要将screen声明为全局变量,因为他们没有试图修改变量。全局变量在函数内部是可读的,无需声明为全局变量。声明这可能是一个好的实践,但这并不能回答OP的问题。哇,非常感谢,这是一个非常好的解释,说实话,我不知道tk和Ttk之间的区别,我只是在看一个教程,但是谢谢