Python (Tkinter) __init__ 限制?

Python (Tkinter) __init__ limitations?

Python 中的 init 方法的条目数是否有限制?我正在使用 Tkinter 构建一个简单的 UI,正确编写的标签在被其他方法引用时被编译器忽略。

代码:

from tkinter import *    
from tkinter import ttk


class UI:

  def __init__(self, root):

    self.entryString = StringVar()
    self.entryString.set("50000000") #Default value     

    self.trialField = Entry(root, textvariable = self.entryString).grid(row = 0, column = 0, columnspan = 2)

    self.trialSend = Button(root, text = "Send value", command = self.setter()).grid(row = 1, column = 0)
    #self.defaultTrials = Button(root, text = "Default", command = self.resetTrials).grid(row = 1, column = 1)

    self.staticLabel = Label(root, text = "This gets sent to program when program is run:").grid(row = 2, column = 0, columnspan = 3)

    self.trialOut = Label(root, text = self.entryString.get())
    self.trialOut.grid(row = 3, column = 0, columnspan = 2)        

  def setter(self):
    self.trialOut.config(text = self.entryString.get())

然而,我收到错误:"AttributeError: 'UI' object has no attribute 'trialOut'"

在某些情况下,我可以将 trialOut 部分移到顶部,而且效果很好。我仍在学习使用 Python 和 Tkinter,所以我很容易忽略了一些东西。非常感谢任何帮助。

问题出在这里:

self.trialSend = Button(root, text = "Send value", command = self.setter()).grid(row = 1, column = 0)

请注意,您正在调用 self.setter,它引用了 self.trialOut,但是 self.trialOut 直到几行之后才被定义。

你可能想要:

self.trialSend = Button(root, text = "Send value", command = self.setter).grid(row = 1, column = 0)

(注意 self.setter 后缺少的括号)延迟调用函数,直到用户单击按钮。


在其他新闻中,您有几行:

self.someWidgetName = SomeWidget(...).grid(...)

在这种情况下,self.someWidgetName始终具有None的值,因为这是[=20=的return值].这可能会导致人们(您!)在阅读您的代码时感到困惑,因为所有这些 class 成员 看起来 似乎应该持有小部件实例,而实际上它们并不存在。更好的做法是按照 self.trialOut 所做的操作——在单独的行上使用几何管理器:

self.someLabel = Label(...)
self.someLabel.grid(...)