Python GUI按钮不会执行

Python GUI按钮不会执行,python,user-interface,button,tkinter,label,Python,User Interface,Button,Tkinter,Label,我正在写一个基本的战争驾驶程序。我已经让它循环命令,将所有无线接入点拉到附近。问题是我的停止按钮不起作用,我无法更新标签(我甚至不确定是否可以更新标签) 我认为主线程挂在开始按钮单击的while循环中。因为它很忙,它甚至不会注意到停止按钮被按下。我认为主线程挂在开始按钮单击的while循环中。因为它很忙,它甚至不会注意到停止按钮被按下。我不能确切地告诉你为什么停止按钮不工作,但我想我知道了你的程序。我的建议是建立两个线程。第一个线程用于UI,第二个线程用于在给定的时间间隔内不断检查无线网络(您当

我正在写一个基本的战争驾驶程序。我已经让它循环命令,将所有无线接入点拉到附近。问题是我的停止按钮不起作用,我无法更新标签(我甚至不确定是否可以更新标签)


我认为主线程挂在开始按钮单击的while循环中。因为它很忙,它甚至不会注意到停止按钮被按下。

我认为主线程挂在开始按钮单击的while循环中。因为它很忙,它甚至不会注意到停止按钮被按下。

我不能确切地告诉你为什么停止按钮不工作,但我想我知道了你的程序。我的建议是建立两个线程。第一个线程用于UI,第二个线程用于在给定的时间间隔内不断检查无线网络(您当前的代码会尽快检查-不好的做法,您应该在循环中暂停)

由于我没有在Tkinter中处理多线程,因此我只能提供以下入口点:

  • 用于每秒或类似时间更新附近的网络

祝你好运!

我不能确切地告诉你停止按钮不起作用的原因,但我想我已经了解了你的程序。我的建议是建立两个线程。第一个线程用于UI,第二个线程用于以给定间隔不断检查无线网络(您当前的代码会尽快检查-错误的做法是,您应该在循环中暂停

由于我没有在Tkinter中处理多线程,因此我只能提供以下入口点:

  • 用于每秒或类似时间更新附近的网络

祝你好运!

Tkinter是单线程的。这意味着,当你在
启动按钮单击
内的
while
循环中时,不会处理任何其他事件。停止按钮在
启动按钮单击
函数完成之前不会调用其命令

您需要记住,您的程序已经在运行一个全局无限循环:事件循环。没有理由在其中放置另一个无限循环。当您希望某个东西永远运行时,诀窍是在事件循环上放置一个迭代,然后在它运行时在事件循环上放置另一个迭代

另一个关键是要确保循环的一次迭代是快速的——它需要在一秒钟之内(更像是在100毫秒以内),否则UI会变得滞后

逻辑如下所示:

def startButtonClick(self):
    self.missionGO = 1
    self._do_one_iteration()

def _do_one_iteration(self):
    if self.missionGO == 1:
        wlan = getAccessPoints()
        x = numberOfAccessPoints(wlan)
        print x
        # this adds another iteration to the event loop
        self.after(10, self._do_one_iteration)

def stopButtonClick(self):
    self.missionGO = 0

Tkinter是单线程的。这意味着当您在
startButtonClick
内的
while
循环中时,不会处理其他事件。停止按钮在
startButtonClick
函数完成之前不会调用其命令

您需要记住,您的程序已经在运行一个全局无限循环:事件循环。没有理由在其中放置另一个无限循环。当您希望某个东西永远运行时,诀窍是在事件循环上放置一个迭代,然后在它运行时在事件循环上放置另一个迭代

另一个关键是要确保循环的一次迭代是快速的——它需要在一秒钟之内(更像是在100毫秒以内),否则UI会变得滞后

逻辑如下所示:

def startButtonClick(self):
    self.missionGO = 1
    self._do_one_iteration()

def _do_one_iteration(self):
    if self.missionGO == 1:
        wlan = getAccessPoints()
        x = numberOfAccessPoints(wlan)
        print x
        # this adds another iteration to the event loop
        self.after(10, self._do_one_iteration)

def stopButtonClick(self):
    self.missionGO = 0

请直接缩进,因为这在Python中是至关重要的。抱歉,当我将缩进复制到问题中时,缩进是混合的。请直接缩进,因为这在Python中是至关重要的。抱歉,当我将缩进复制到问题中时,缩进是混合的。这就是我的想法,但是否存在其他问题?是的。您可以在dif中处理UI事件不同的线程(或在不同的线程中工作)。您还可以检查tkinter是否提供了“mainloop”的替代方案,以便您可以编写自己的mainloop,在同一个线程中处理UI事件和工作。这就是我的想法,但是否存在其他问题?是的。您可以在不同的线程中处理UI事件(或者在不同的线程中进行工作)。您还可以检查tkinter是否提供了“mainloop”的替代方案因此,您可以编写自己的主循环,在同一线程中处理UI事件和您的工作。我得到一个AttributeError:App实例没有“after”属性。知道这是怎么回事吗?@iFetus:我应该说上面假设
self
作为Tkinter.Tk的实例。在您的情况下,您需要使用
master.after
self.master.after
或其他任何东西。
after
是所有小部件都通用的Tkinter方法。我得到了一个AttributeError:App实例没有“after”属性。你知道这是怎么回事吗?@iFetus:我应该说上面假设Tkinter.Tk的as实例中有
self
。在你的情况下,你需要使用
master.after
>self.master.after
或其他任何东西。
after
是所有小部件通用的Tkinter方法。