Python GUI按钮无法执行

2024-05-20 21:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

import sys, os, subprocess, re
from Tkinter import *

missionGO = 0
count = 0

class App:

def __init__(self, master):

    frame = Frame(master)
    frame.pack()

    self.start = Button(frame, text="Start", fg="green",
                        command=self.startButtonClick)
    self.start.grid(row=3)

    self.stop = Button(frame, text="Stop", fg="red",
                       command=self.stopButtonClick)
    self.stop.grid(row=3, column=1)

    self.totalSSIDLabel = Label(frame, text="Current Access Points: ")
    self.totalSSIDLabel.grid(row=0)

    self.totalSSID = Label(frame, text=count)
    self.totalSSID.grid(row=0, column=1)

def startButtonClick(self):
    missionGO = 1
    while (missionGO == 1):
        wlan = getAccessPoints()
        x = numberOfAccessPoints(wlan)
        print x
    return

def stopButtonClick(self):
    missionGO = 0
    return

def stop(event):
    missionGO = 0

# Finds all wireless AP
def getAccessPoints():
    X = subprocess.check_output("netsh wlan show network mode=Bssid",
                                shell=True)
    return X

def numberOfAccessPoints(file):
    count = 0
    words = file.split()

for line in words:
    if re.match('SSID', line):
        count = count + 1
    return count

#Main
root = Tk()
app = App(root)
root.mainloop()

Tags: textimportselfreturndefcountroot标签
3条回答

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

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

祝你好运!在

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

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

另一个关键是要确保循环的一次迭代速度很快,它需要在一秒钟之内(更像是在100ms以下),否则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

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

相关问题 更多 >