这就是我的想法:我在OPC服务器中有数据(数字),我想通过GUI检索。这些数据应该每5秒更新一次,因此也会显示在GUI中。我已经通过一个while循环尝试过了,它也可以作为打印输出,但是没有窗口显示给我了。
会有也许有人一个主意,我可以如何实现这一点?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Tkinter
from Tkinter import *
import sys
import os
import time
from opcua import Client
url = "opc.tcp://xxxxxxx"
client = Client(url)
client.connect()
#create main window
master = Tkinter.Tk()
print('test')
master.title("GUI Raspberry")
master.geometry("900x900")
label = Tkinter.Label(master, text='test')
label2 = Tkinter.Label(master, text='')
label.pack(padx = 5, pady = 10, side = LEFT)
while True:
Mean = client.get_node("ns=2;i=3")
MeanValue = Mean.get_value()
label2['text'] = MeanValue
label2.pack(padx = 5, pady = 20, side = LEFT)
print(MeanValue)
time.sleep(5)
master.update()
time.sleep(2)
master.mainloop()
master.destroy()
在任何GUI中使用while True
都不是好主意。它阻止mainloop
从系统获取键/鼠标事件,将它们发送给小部件,运行分配给按钮和其他小部件的函数,(重新)绘制窗口和小部件。
你可能需要在单独的线程中运行while True
-但是线程不能更新部件,它必须将结果发送到主线程-这会产生其他问题。
或者您应该检查是否可以使用"timer"
而不是while
定期运行代码。
所有gui都有一些"timer"
。tkinter
有master.after(milliseconds, function_name)
我无法测试它,但它可能是这样的
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import time
import Tkinter as tk
from opcua import Client
# --- functions ---
def function():
mean = client.get_node("ns=2;i=3") # PEP8: `lower_case_name` for variables
mean_value = mean.get_value() # PEP8: `lower_case_name` for variables
label2['text'] = mean_value
print(mean_value)
master.after(5000, function) # run again after 5000ms (5s)
# --- main ---
url = "opc.tcp://xxxxxxx"
client = Client(url)
client.connect()
# create main window # PEP8: in comment add space after `#` (and two spaces before `#` if it is in line with code)
master = tk.Tk()
print('test')
master.title("GUI Raspberry")
master.geometry("900x900")
label1 = tk.Label(master, text='test')
label1.pack(padx=5, pady=10, side='left')
label2 = tk.Label(master, text='')
label2.pack(padx=5, pady=20, side='left') # show it only once
function() # run first time
master.mainloop()
PEP 8——Python代码风格指南