在python中将类与Tkinter一起使用

时间:2018-08-25 09:45:03

标签: python class tkinter

嗨,我想知道第一段代码(有效)和第二段代码(无效)之间的区别。

第1块:

from tkinter import *      

class Temp:
    def __init__(self, master):
        self.master = master
        self.var = self.userEntryFunc()
        self.var.pack()   

    def userEntryFunc(self):    
        return Entry(self.master)

def getval(x,y):
    cn1 = x.var.get()
    cn2 = y.var.get()
    print(cn1 + " and " + cn2)

root = Tk()
root.geometry("500x500")
Name = Temp(root)
Name2 = Temp(root)
b = Button(root, text="pree", command=lambda: getval(Name,Name2))
b.pack()

root.mainloop()

第2块:

from tkinter import *      


class Temp:
    def __init__(self, master):
        self.master = master

    def userEntryFunc(self):    
        return Entry(self.master)

    def getValue(self):
        self.var = self.userEntryFunc()
        self.var.pack()

def getval(x,y):
    cn1 = x.var.get()
    cn2 = y.var.get()
    print(cn1 + " and " + cn2)

root = Tk()
root.geometry("500x500")
Name = Temp(root).getValue()
Name2 = Temp(root).getValue()
b = Button(root, text="pree", command=lambda: getval(Name, Name2))
b.pack()

root.mainloop()

block2错误消息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "<ipython-input-111-c906f1aea49c>", line 24, in <lambda>
    b = Button(root, text="pree", command=lambda: getval(Name, Name2))
  File "<ipython-input-111-c906f1aea49c>", line 16, in getval
    cn1 = x.var.get()
AttributeError: 'NoneType' object has no attribute 'var'

我的主要目标是让多个Temp类型的对象在Variable类中具有不同的tkinter小部件定义,并将它们的值用作将来代码的变量。我的问题是,我不想在 init 函数中使用5种不同的条件来针对不同的变量类型(用户输入,按钮,目录浏览)执行此操作。例如:

  if varName=="userEntry":
        self.var = self.userEntryFunc()
        self.var.pack()
  elif varName=="radioButton":
        self.var = self.radioButtonFunction()
        ...

1 个答案:

答案 0 :(得分:2)

在第一个代码示例中,Entry小部件由__init__函数(创建实例时)通过userEntryFunc函数创建,然后打包。但是,在第二个示例中,Temp类在创建时不会创建任何东西,它的getValue函数必须在外部调用。

您遇到的错误发生是因为clientNameclientName2实际上是分配给getValue而不是Temp实例的返回值。要解决此问题,您需要将实例分配给变量,然后调用getValue函数,如下所示:

clientName = Temp(root, "Client Name")
clientName.getValue()
clientName2 = Temp(root, "Client Name2")
clientName2.getValue()

还请注意以下行:

lister = [clientName, clientName2]

在示例1中,将创建一个错误,而是使用:

lister = [Name, Name2]

编辑:以上问题现已解决