为了账号安全,请及时绑定邮箱和手机立即绑定

tkinter root.after 运行直到满足条件,冻结窗口导航栏直到满足条件。为什么?

tkinter root.after 运行直到满足条件,冻结窗口导航栏直到满足条件。为什么?

慕斯王 2024-01-15 15:36:41
因此,我进行了广泛的尝试来找出运行代码的最佳方法。最好的建议是递归运行 root.after 直到满足条件。这有效,但它会冻结窗口,直到满足条件。我不知道出了什么问题或如何解决这个问题。我想显示 tkinter 对话框窗口,每 1000 毫秒检查一次是否满足条件,一旦满足就允许“下一步”按钮变得可单击。这一切都有效,除非条件从未满足,否则无法退出程序,因为导航栏卡在“无响应”状态。我真的需要这个导航栏不被搞乱。与关闭按钮相比,我更喜欢它。这是代码def checkForPortConnection(root, initial_ports):    new_ports = listSerialPorts()    root.after(1000)    if initial_ports == new_ports:        checkForPortConnection(root, initial_ports)    else:        return    def welcomeGui():        root = tk.Tk()    root.title('Setup Wizard')    canvas1 = tk.Canvas(root, relief = 'flat')    welcome_text='Welcome to the setup wizard for your device'    text2 =  'Please plug your device into a working USB port'    text3 = 'If you have already plugged it in, please unplug it and restart the wizard. \n Do not plug it in until the wizard starts. \n The "NEXT" button will be clickable once the port is detected'    label1 = tk.Label(root, text=welcome_text, font=('helvetica', 18), bg='dark green', fg='light green').pack()    label2 = tk.Label(root, text=text2, font=('times', 14), fg='red').pack()    label3 = tk.Label(root, text=text3, font=('times', 12)).pack()    nextButton = ttk.Button(root, text="NEXT", state='disabled')    nextButton.pack()    initial_ports = listSerialPorts()        root.update()    checkForPortConnection(root, initial_ports)    new_ports = listSerialPorts()    correct_port = [x for x in initial_ports + new_ports if x not in initial_ports or x not in new_ports]    print(correct_port)    nextButton.state(["!disabled"])    root.mainloop()
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

root.after(1000)实际上与time.sleep(1)- 它冻结 UI 直到时间到期相同。它不允许事件循环处理事件。


如果您想checkForPortConnection每秒调用一次,这是正确的方法:


def checkForPortConnection(root, initial_ports):

    new_ports = listSerialPorts()

    if initial_ports == new_ports:

        root.after(1000, checkForPortConnection, root, initial_ports)

checkForPortConnection这将在未来(或多或少)调用一秒钟,传递root和initial_ports作为参数。每次运行时,它都会安排自己在将来再次运行,直到不再满足条件为止。


在该时间段到期之前,mainloop能够继续正常处理事件。


查看完整回答
反对 回复 2024-01-15
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信