【问题标题】:Tkinter Button stays pressed during function executionTkinter 按钮在函数执行期间保持按下状态
【发布时间】:2020-12-02 16:46:57
【问题描述】:

我正在使用 Tkinter 库在 Python 中编写一个 domotic 控制程序。 有一个按钮可以启动位于其他脚本中的函数(我在开头包含了它)。

该按钮工作正常,但在我的功能执行期间它仍然被按下,这需要一些时间来执行...... 我会放置一个“等待屏幕”,而不是仅仅按下按钮并且程序没有响应。 我加入了我的代码摘录。

我到处搜索,但没有找到明确的解决方案。

希望你能帮助我!

主脚本:

import backend
from tkinter import *

window = Tk()
frameMain  = Frame(window)
buttonConnection = Button(frameMain, text="Connect devices", command=backend.configDevices)
frameMain.pack()

backend.py 脚本:

pathConfip = 'assets/confip.txt'
...
def configDevices():
    with open(pathConfip, 'r', encoding='utf-8') as fileConfip:
        # ips are in a text file, separated by "###" each time
        ip = fileConfip.read().split('###')
    global bulb1, bulb2, bulb3, stripeBulb, lgtv, cast
    bulb1 = Bulb(ip[0])
    bulb2 = Bulb(ip[1])
    bulb3 = Bulb(ip[2])
    stripeBulb = Bulb(ip[3])
    lgtv = WebOsClient(ip[4])
    cast = Chromecast(ip[5])

【问题讨论】:

  • Tkinter 是单线程的。如果函数需要很长时间才能运行,您需要在单独的线程中运行它,因为当您的函数在主线程中运行时 tkinter 无法刷新窗口。
  • 谢谢!我该怎么做才能创建一个单独的线程?我是初学者,我只是看看怎么做,但我不明白。你能推荐一个好的教程来学习如何做吗?
  • 您可以将您的方法绑定到按钮上的MouseRelease 事件。你也可以做一些 hacky 比如:command=lambda:(buttonConnection['state']='normal', backend.configDevices())。我并不是说这些是理想的解决方案。
  • 为什么不直接输入 threading tkinter。有很多不那么难的视频。
  • 目前我将使用 Eric Roy 的方法,因为我不需要非常“正确”的东西,但非常感谢!

标签: python function button tkinter


【解决方案1】:

正如 Bryan 在 cmets 上所说,处理此问题的最佳方法是使用线程。也许最简单的方法(无需过多了解)是通过命令运行另一个 python 脚本。

import os
os.system("python file.py &")

请注意,这将适用于 Linux。要在 Windows 后台运行命令,您需要使用 pythonw.exe 而不是 python.exe(请参阅 here)。 Pythonw 也可以在 Linux 上运行。

最后一件事,如何知道命令何时结束? 同样,最简单(但也很丑陋)的方法是修改位于同一文件夹中的文件(json 或 txt)。然后,每隔一秒左右,tkinter 应用程序就可以查看文件,如果文件发生了变化,它就会知道何时停止显示加载屏幕。

【讨论】:

  • 嗯,我试试这个方法,看起来很简单,谢谢。
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2017-12-25
相关资源
最近更新 更多