用Python调用INCA的COM接口以实现自动化测试/标定时,一定少不了对试验环境变量的频繁读写,对多个变量的长时间监测于操作目前只能想到线程的机制。
但是在实际执行中线程依旧回锁定主UI窗口,多番尝试未能找到原因。
后续计划将构建GUI的类与操作INCA-API的函数分开来试试
不知道有没有大拿在这方面有经验的原因指点一二
问题代码:
(即使将self相关的方法全部剔除,依旧会锁死UI窗口)
def GetVeSlewButtonclik(self):
#获取VEERR标定名,获取VEERR标定值的对象,并建立线程,持续获取标定值
#self.GetVeerrCalibValue()
tread_VeerrGet=threading.Thread(target=ccc())
tread_VeerrGet.start()
#self.value_VEerrslew=self.VEerrslewvalue.GetDoublePhysValue()
#self.VEERRshow.configure(text='%.2f'%self.value_VEerrslew) #格式化字符串,保留两位小数显示
def GetVeerrCalibValue(self):
#这里有问题,线程执行会卡住主线程的运行,窗口停止刷新
#self.Vecalib=self.VEcaliblabel.get()
#self.VEerrslewvalue=self.opendexp.GetCalibrationValue(self.Vecalib)
for i in range(3600):
#self.value_VEerrslew=self.VEerrslewvalue.GetDoublePhysValue()
#self.VEERRshow.configure(text='%.2f'%self.value_VEerrslew) #格式化字符串,保留两位小数显示
time.sleep(1)
print("线程运行至"+str(i))
完整demo:
from tkinter import *
from tkinter import ttk
import win32com.client as client
import threading
import time
class newapp():
def __init__(self) -> None:
self.value_VEerrslew=DoubleVar=0
self.value_VEerr=DoubleVar=0
#创建主窗体
app=Tk()
app.title("INCA auto tool")
app.geometry('400x300')
#在主窗体中添加Notebook组件,设置完全填充,自动扩展
pages=ttk.Notebook(app)
pages.pack(fill='both',expand=True)
#在Notebook组件中初始化两个Frame框架页面
ControlPage=Frame(pages)
SetPage=Frame(pages)
#将两个框架作页面添加进去
pages.add(ControlPage,text='控制')
pages.add(SetPage,text='设置')
#按钮 连接inca
incaButton=Button(ControlPage,text='连接INCA',command=self.incaButtonclik)
incaButton.grid(row=0,column=0,padx=5,pady=5)
#状态label 连接inca
self.incalabel=Label(ControlPage,text='请连接INCA')
self.incalabel.grid(row=0,column=1,columnspan=2)
#按钮 连接环境
expButton=Button(ControlPage,text='连接环境',command=self.expButtonclik)
expButton.grid(row=1,column=0,padx=5,pady=5)
#状态label 连接环境
self.explabel=Label(ControlPage,text='请连接环境')
self.explabel.grid(row=1,column=1,columnspan=2)
#按钮 获取ve偏移标定量
GetVeSlewButton=Button(ControlPage,text='获取标定',command=lambda:threading.Thread(target=ccc()).start())#######
GetVeSlewButton.grid(row=2,column=0,padx=5,pady=5)
#输入框 获取VE标定量
self.VEcaliblabel=Entry(ControlPage)
self.VEcaliblabel.grid(row=2,column=1,columnspan=2)
#标题label VEERR标定值:
VEERRtitle=Label(ControlPage,text='VE偏移量标定值:')
VEERRtitle.grid(row=3,column=0,columnspan=2)
#值label VEERR标定值数字显示:
self.VEERRshow=Label(ControlPage,text=self.value_VEerrslew)#VEERR标定值数字显示,跟随线程Veerr_getting刷新
self.VEERRshow.grid(row=3,column=2)
app.wm_attributes("-topmost",True)
app.mainloop()
def incaButtonclik(self):
#建立于INCA服务器的连接
self.myinca=client.Dispatch('Inca.Inca')
self.incalabel.configure(text=('获取INCA版本号:'+self.myinca.APIVersion()))
def expButtonclik(self):
#建立于环境的连接,并判断是否为OnlineExperiment对象
self.opendexp=self.myinca.GetOpenedExperiment()
self.explabel.configure(text=("连接环境状态:"+str(self.opendexp.IsOnlineExperiment())))
def GetVeSlewButtonclik(self):
#获取VEERR标定名,获取VEERR标定值的对象,并建立线程,持续获取标定值
#self.GetVeerrCalibValue()
tread_VeerrGet=threading.Thread(target=ccc())
tread_VeerrGet.start()
#self.value_VEerrslew=self.VEerrslewvalue.GetDoublePhysValue()
#self.VEERRshow.configure(text='%.2f'%self.value_VEerrslew) #格式化字符串,保留两位小数显示
def GetVeerrCalibValue(self):
#这里有问题,线程执行会卡住主线程的运行,窗口停止刷新
#self.Vecalib=self.VEcaliblabel.get()
#self.VEerrslewvalue=self.opendexp.GetCalibrationValue(self.Vecalib)
for i in range(3600):
#self.value_VEerrslew=self.VEerrslewvalue.GetDoublePhysValue()
#self.VEERRshow.configure(text='%.2f'%self.value_VEerrslew) #格式化字符串,保留两位小数显示
time.sleep(1)
print("线程运行至"+str(i))
#测试线程
def ccc():
for i in range(3600):
time.sleep(1)
print("线程运行至"+str(i))
newapp()
截至2024/8/2,这个问题被AI解决了,调用after,以及UI定时自刷新的方法
话说现在的AI已经这么强大了吗,我折腾了两三天没解决的事情让AI一遍修好,甚至还识别出了这个代码的意图,把写的那些的测试代码给删了。