关于用Python调用INCA的COM接口,以实现自动化测试时遇到的问题:thread线程卡住UI界面,无法操作和刷新

 用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一遍修好,甚至还识别出了这个代码的意图,把写的那些的测试代码给删了。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值