Tkinter 更新标签失败,出现"AttributeError: 'Frame' object has no attribute 'label1' "



我试图把我的第一个tkinter应用程序放在一起,显示从Arduino串行端口收到的值,我成功地制作了控制台应用程序,但我是GUI新手。

raw0是带有'NR'的字符串原始1 - 4是int兼容值raw5是字符串'EOR'

下面是我的代码:
#!/usr/bin/python3
import tkinter as tk
import tkinter.ttk as ttk
import serial
Arduino = serial.Serial('/dev/ttyUSB3', '115200', timeout=1)
print('Connection is working')
value1 = 0
value2 = 0
value3 = 0
value4 = 0
class App:
def readdata(self):
Arduino.write(bytes('n', 'utf-8'))
for x in range(0, 6):
globals()['raw%s' % x] = Arduino.readline().decode().strip()
self.value1 = int(raw1)
self.value2 = int(raw2)
self.value3 = int(raw3)
self.value4 = int(raw4)
App.changelabels(self.mainframe)
def changelabels(self):
label1.config(text=self.value1.get())
def __init__(self, master=None):
# build ui
self.appwindow = tk.Tk() if master is None else tk.Toplevel(master)
self.appwindow.configure(height=240, width=320)
self.appwindow.minsize(320, 240)
self.mainframe = ttk.Frame(self.appwindow)
self.mainframe.configure(height=240, width=320)
label1 = ttk.Label(self.mainframe)
self.value1 = tk.IntVar()
label1.configure(textvariable=self.value1)
label1.grid(column=1, row=0)
label2 = ttk.Label(self.mainframe)
self.value2 = tk.IntVar()
label2.configure(textvariable=self.value2)
label2.grid(column=1, row=1)
label3 = ttk.Label(self.mainframe)
self.value3 = tk.IntVar()
label3.configure(textvariable=self.value3)
label3.grid(column=1, row=2)
label4 = ttk.Label(self.mainframe)
self.value4 = tk.IntVar()
label4.configure(textvariable=self.value4)
label4.grid(column=1, row=3)
self.text1 = ttk.Label(self.mainframe)
self.text1.configure(text='Value1: ')
self.text1.grid(column=0, row=0)
self.text2 = ttk.Label(self.mainframe)
self.text2.configure(text='Value2: ')
self.text2.grid(column=0, row=1)
self.text3 = ttk.Label(self.mainframe)
self.text3.configure(text='Value3: ')
self.text3.grid(column=0, row=2)
self.text4 = ttk.Label(self.mainframe)
self.text4.configure(text='Value4:  ')
self.text4.grid(column=0, row=3)
progressbar1 = ttk.Progressbar(self.mainframe)
progressbar1.configure(orient="horizontal")
progressbar1.grid(column=2, row=0)
progressbar2 = ttk.Progressbar(self.mainframe)
progressbar2.configure(orient="horizontal")
progressbar2.grid(column=2, row=1)
progressbar3 = ttk.Progressbar(self.mainframe)
progressbar3.configure(orient="horizontal")
progressbar3.grid(column=2, row=2)
progressbar4 = ttk.Progressbar(self.mainframe)
progressbar4.configure(orient="horizontal")
progressbar4.grid(column=2, row=3)
self.refresh = ttk.Button(self.mainframe)
self.refresh.configure(text='Refresh')
self.refresh.configure(command=self.readdata)
self.refresh.grid(column=1, row=4)
self.mainframe.pack(side="top")
# Main widget
self.mainwindow = self.appwindow
def run(self):
self.mainwindow.mainloop()
if __name__ == "__main__":
app = App()
app.run()

非常感谢你,祝你一天愉快!我试图用存储在value1-4中的变量更新标签(label1-4),但我无法这样做,主要是因为我不知道如何正确地接近标签。我尝试过各种方法来解决这个问题,但每次都失败了。有人愿意给我指路吗?

label1 = ttk.Label(self.mainframe)更改为self.label1 = ttk.Label(self.mainframe),并在其他使用self的地方类似地为label1的所有引用加上前缀。这样,作为App类成员的所有方法(并有权访问self)将有权访问self.label1

最新更新