在按钮按下Tkinter(Python)上更改小部件

2024-09-30 02:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个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命令

^{pr2}$

出现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

Tags: lambdatextinpyselfconfigdefwidgets
1条回答
网友
1楼 · 发布于 2024-09-30 02:25:18

问题出在工具栏的创建上

toolBar = [('Edit', lambda :(makeGui.update(root)), {'side': 'left'}),
               ('Add', lambda: 0, {'side': 'left'}),
               ('Remove', lambda: 0, {'side': 'left'})
               ]

特别是makeGui.update(root)。在

您希望按钮执行的操作是调用您创建的makeGui实例的update方法,但您所做的是调用makeGui类上的update方法。问题是现在不能引用makeGui实例,因为它还不存在。在

LocalGuiMaker类之外定义menuBartoolBar和{}有什么理由吗?它已经是makeGui类的一个简单包装,对吗?如果在start函数中定义它们,则可以使用self引用类实例:

^{pr2}$

相关问题 更多 >

    热门问题