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(...)
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(...)