我正在为一个GUI编写代码,显示一些带有标签的文本,在按下按钮时,我想更改我的标签的文本。 这是我制作小部件的代码。在
def makeWidget(self):
self.widgets = []
widget1 = Label(self, width=50, height=20)
widget1.config(text='There is going to be smth here!')
widget1.pack(side=TOP, fill=BOTH)
self.widgets.append(widget1)
我在我的__init__(self, parent=None)
中调用这个函数。一切都很顺利。但当我按下按钮时,我将为其分配update
命令
出现Error
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python37-32\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "C:/Users/User/PycharmProjects/untitled4/venv/main.py", line 17, in
<lambda>
toolBar = [('Edit', lambda :(makeGui.update(root)), {'side': 'left'}),
File "C:\Users\User\PycharmProjects\untitled4\venv\Include\menu_toolbar.py",
line 71, in update
self.widgets[0].config(text='Here text should change')
File "C:\Python37-32\lib\tkinter\__init__.py", line 2098, in __getattr__
return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'widgets'
我最初认为这个问题是因为self.widget
没有保存在任何地方,这就是为什么要用self.widgets=[]
来保存它
有人能帮忙吗?我如何在我的小部件与按钮按下更改。在
注:如果问题不在我前面提到的地方,这里是我的完整代码:
这是我的main.py
:
from tkinter import *
from Include.menu_toolbar import makeGui
import time
root=Tk()
menuBar = [
('File', 0,
[('Open', 0, lambda: 0),
('Quit', 0, sys.exit)]),
('Edit', 0,
[('Add', 0, lambda: 0),
('Remove', 0, lambda: 0)]),
('Help', 0,
[('About', 0, lambda: 0),
('Optins', 0, lambda: 0)])
]
toolBar = [('Edit', lambda :(makeGui.update(root)), {'side': 'left'}),
('Add', lambda: 0, {'side': 'left'}),
('Remove', lambda: 0, {'side': 'left'})
]
toolbarColor = '#3C3F41'
class LocalGuiMaker(makeGui):
def start(self):
self.menuBar = menuBar
self.toolBar = toolBar
self.toolbarColor = toolbarColor
LocalGuiMaker(root).mainloop()
这是我的menu_toolbar.py
:
from tkinter import *
import sys, time
class makeGui(Frame):
menuBar = []
toolBar = []
toolbarColor = 'white'
def __init__(self, parent=None):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH)
self.start()
self.makeMenuBar()
self.makeToolBar()
self.makeWidget()
def makeMenuBar(self):
menubar = Menu(self.master)
self.master.config(menu=menubar)
for (name, u_index, items) in self.menuBar:
pulldown = Menu(menubar)
self.addItems(pulldown, items)
menubar.add_cascade(label=name, underline=u_index, menu=pulldown)
def addItems(self, menu, items):
for item in items:
if item == 'separator':
menu.add_separator({})
elif type(item[2]) != list:
menu.add_command(label=item[0],
underline=item[1],
command=item[2])
else:
pullover = Menu(menu)
addItem(pullover, item[2])
menu.add_cascade(label=item[0],
underline=item[1],
menu=pullover)
def makeToolBar(self):
toolbar = Frame(self, relief=SUNKEN, bd=2, bg=self.toolbarColor)
toolbar.pack(side=BOTTOM, fill=X)
for (name, command, place) in self.toolBar:
Button(toolbar, text=name, command=command, fg='white',
bg=self.toolbarColor).pack(place)
clock = Label(toolbar, fg='white', bg=self.toolbarColor)
clock.pack(side=RIGHT, expand=False, fill=Y)
time1 = ''
def tick():
nonlocal time1
time2 = time.strftime('%H:%M:%S')
if time2 != time1:
time1 = time2
clock.config(text=time1)
clock.after(200, tick)
tick()
def makeWidget(self):
self.widgets = []
widget1 = Label(self, width=50, height=20)
widget1.config(text='There is going to be smth here!')
widget1.pack(side=TOP, fill=BOTH)
self.widgets.append(widget1)
def update(self):
self.widgets[0].config(text='Here text should change')
def start(self):
pass
问题出在工具栏的创建上
特别是
makeGui.update(root)
。在您希望按钮执行的操作是调用您创建的
makeGui
实例的update
方法,但您所做的是调用makeGui
类上的update
方法。问题是现在不能引用makeGui
实例,因为它还不存在。在在}有什么理由吗?它已经是
^{pr2}$LocalGuiMaker
类之外定义menuBar
、toolBar
和{makeGui
类的一个简单包装,对吗?如果在start
函数中定义它们,则可以使用self
引用类实例:相关问题 更多 >
编程相关推荐