Кнопки Python GUI не будут выполняться - PullRequest
0 голосов
/ 29 марта 2012

Я пишу основную военную программу.Я получил это, чтобы зациклить команду, чтобы вытащить все точки беспроводного доступа поблизости.Проблема в том, что моя кнопка остановки не работает, и я не могу обновить ярлык (я даже не уверен, смогу ли я обновить ярлык).

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()

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

Tkinter однопоточный.Это означает, что пока вы находитесь в цикле while внутри startButtonClick, никакие другие события не обрабатываются.Кнопка останова не будет вызывать свою команду до тех пор, пока не завершится функция startButtonClick

Вам необходимо помнить, что ваша программа уже выполняет глобальный бесконечный цикл: цикл обработки событий.Там нет причин, чтобы положить еще один бесконечный цикл внутри него.Когда вы хотите, чтобы что-то выполнялось вечно, хитрость заключается в том, чтобы поместить одну итерацию в цикл событий, а затем, когда она выполняется, она помещает другую итерацию в цикл событий.

Другой ключ к этому - убедиться, что одна итерация цикла быстрая - она ​​должна быть намного меньше секунды (более похожа на 100 мс), иначе интерфейс станет медленным.

Логика выглядит примерно так:

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
1 голос
/ 29 марта 2012

Я не могу точно сказать, почему ваша кнопка остановки не работает, но мне кажется, я понял вашу программу. Мое предложение состоит в том, чтобы установить две темы. Первый поток для пользовательского интерфейса и второй для постоянной проверки беспроводных сетей с заданным интервалом (ваш текущий код проверяет как можно скорее - плохая практика, вы должны сделать паузу в цикле.

Поскольку я не имел дело с многопоточностью в Tkinter, я могу предоставить вам только точки входа:

Удачи!

1 голос
/ 29 марта 2012

Я думаю, что основной поток висит в цикле while нажатия кнопки запуска.Поскольку он занят, он даже не заметит, что была нажата кнопка остановки.

...