英文:
Tkinter updating label fails with "AttributeError: 'Frame' object has no attribute 'label1' "
问题
#!/usr/bin/python3
import tkinter as tk
import tkinter.ttk as ttk
import serial
Arduino = serial.Serial('/dev/ttyUSB3', '115200', timeout=1)
print('连接正常')
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)
self.changelabels()
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='刷新')
self.refresh.configure(command=self.readdata)
self.refresh.grid(column=1, row=4)
self.mainframe.pack(side="top")
# 主窗口
self.mainwindow = self.appwindow
def run(self):
self.mainwindow.mainloop()
if __name__ == "__main__":
app = App()
app.run()
请注意,我已经将代码中的中文注释翻译为英文,但未翻译代码本身。
英文:
I'm trying to put together my first tkinter application, showing values recieved from Arduino serial port, I successfully managed to make console application, but I'm novice in GUI.
raw0 is string with 'NR'
raw 1 - 4 are int compatible values
raw5 is string 'EOR'
here is my code:
#!/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()
Thank you very much and have a nice day!
I'm trying to update labels (label1-4) with variables stored in value1-4, but I'm unable to do so, mostly because I don't know how to approach labels correctly.
I've tried various ways how to approach this, but I've failed every time. Is anybody willing to kick me into right direction?
答案1
得分: 0
将label1 = ttk.Label(self.mainframe)
修改为self.label1 = ttk.Label(self.mainframe)
,并且在所有其他地方将对label1
的引用都以self
为前缀使用。这样,所有属于您的App
类的方法(并且可以访问self
)将能够访问self.label1
。
英文:
Change label1 = ttk.Label(self.mainframe)
to self.label1 = ttk.Label(self.mainframe)
and similarly prefix all references to label1
with self
everywhere else it's used. That way, all methods that are members of your App
class (and have access to self
) will have access to self.label1
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论