pyautogui работает с терминала, но не с кнопки tkinter

Добрый вечер, я пытаюсь научиться программировать на Python, поэтому я написал короткий скрипт, который ищет на экране кнопку, а затем нажимает ее определенное количество раз. У меня есть код под «RunScript», также сохраненный как собственный файл. Когда я запускаю этот скрипт с терминала, он работает нормально, но когда я пытаюсь выполнить его, дважды щелкнув значок или с помощью кнопки в окне tkinter, используя приведенный ниже код, он запрашивает у меня несколько циклов, а затем ничего не делает. Я работаю на виртуальной машине Lubuntu. Пожалуйста, не могли бы вы сказать мне, что мне не хватает? Спасибо

#!/usr/bin/python3

from tkinter import *
import pyautogui
import easygui
PauseStatus = False

def RunScript():
    LoopCount = easygui.enterbox('How Many Loops?')
    for i in range (int(LoopCount)):
        if PauseStatus:
            easygui.msgbox(str(i) + ' loops completed\n' + str(int(LoopCount)-i) + 'loops remaining')
            PauseStatus = False
        while True:
            ButtonPos = pyautogui.locateOnScreen('MyButton.png')
            if ButtonPos is not None:
                break
        pyautogui.click(ButtonPos[0],ButtonPos[1],duration=0.25)
    while True:
        ButtonPos = pyautogui.locateOnScreen('MyButton.png')
        if ButtonPos is not None:
            break
    easygui.msgbox(str(i+1) + ' loops completed')

root = Tk()
ControlPanel = Frame(root)
ControlPanel.pack()

startbutton = Button(ControlPanel, text="Start",command = RunScript)
startbutton.pack(side = LEFT)

stopbutton=Button(ControlPanel,text="Stop")
stopbutton.pack(side = LEFT)

root.mainloop()

person LoveMonkey    schedule 12.02.2016    source источник
comment
запустите скрипт tkinter в терминале - возможно, вы получите сообщение об ошибке.   -  person furas    schedule 12.02.2016
comment
Кстати: locateOnScreen всегда возвращает одну и ту же позицию (первой найденной кнопки), поэтому вам не нужно использовать цикл while.   -  person furas    schedule 12.02.2016
comment
Спасибо. Я запустил терминал и получил сообщение об ошибке, которое вы упомянули ниже. Я переместил PauseStatus внутрь части def, и теперь он работает.   -  person LoveMonkey    schedule 14.02.2016
comment
Кнопка становится серой после нажатия, а затем снова становится серой, когда ее можно нажать снова. Цель цикла while состоит в том, чтобы убедиться, что код не пытается нажать серую кнопку, хотя я намерен изменить это, чтобы сохранить расположение кнопки как отдельное, а затем искать изображение только в этой области экрана. каждую петлю, чтобы сделать это быстрее. Я также читал, что для того, чтобы Pause работал, мне нужно изменить цикл while на after, но я все еще пытаюсь заставить это работать. Спасибо еще раз   -  person LoveMonkey    schedule 14.02.2016


Ответы (1)


У вас есть сообщение об ошибке, похожее на это

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1539, in __call__
    return self.func(*args)
  File "<pyshell#3>", line 11, in RunScript
    if PauseStatus:
UnboundLocalError: local variable 'PauseStatus' referenced before assignment

Вы должны использовать global в функции RunScript

def RunScript():
    global PauseStatus

или вам нужно объявить переменную внутри функции как локальную переменную

def RunScript():
    PauseStatus = False
person furas    schedule 12.02.2016
comment
Я получил это сообщение об ошибке в терминале и применил ваше исправление. Теперь код работает, когда я нажимаю кнопку на своем поле tkinter. Спасибо - person LoveMonkey; 14.02.2016