Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 设置未在GUI中输入的变量和;“没有回应”;问题_Python_Python 3.x_Pyautogui_Pysimplegui - Fatal编程技术网

Python 设置未在GUI中输入的变量和;“没有回应”;问题

Python 设置未在GUI中输入的变量和;“没有回应”;问题,python,python-3.x,pyautogui,pysimplegui,Python,Python 3.x,Pyautogui,Pysimplegui,我想写一个程序,移动鼠标光标并按下shift键,这样电脑就不会被锁定。问题是,如果用户没有设置两个变量,它们应该自动设置为0和1,但我似乎遗漏了一些东西。另一件我无法理解的事情是,当我启动程序时,如果我没有点击它,一切都正常,但如果我点击程序的窗口,它会显示“没有响应”,但程序正在运行。我不明白我在这里做错了什么。下面是我的代码: #!/usr/bin/python import pyautogui import time import sys import os import PySimple

我想写一个程序,移动鼠标光标并按下shift键,这样电脑就不会被锁定。问题是,如果用户没有设置两个变量,它们应该自动设置为0和1,但我似乎遗漏了一些东西。另一件我无法理解的事情是,当我启动程序时,如果我没有点击它,一切都正常,但如果我点击程序的窗口,它会显示“没有响应”,但程序正在运行。我不明白我在这里做错了什么。下面是我的代码:

#!/usr/bin/python
import pyautogui
import time
import sys
import os
import PySimpleGUI as sg
from datetime import datetime

def main():
    sg.theme('DarkAmber')
    layout = [  [sg.Text('Please enter the time intervall between the movements:', size = (45,1)), sg.Input(key='-IT-', enable_events=True)],
                [sg.Text('Please enter how long should the script run:', size = (45,1)), sg.Input(key='-DURATION-', enable_events=True)],
                [sg.Button('Start'), sg.Button('Stop')],
                [sg.Output(size=(60,15))]   ]
    window = sg.Window('Press to start to move!', layout, size=(450,250), element_justification='right')
    while True:
        event, values = window.read()
        if event in (sg.WIN_CLOSED, 'Stop'):         
            break
        
        if event == '-IT-' and values['-IT-'] and values['-IT-'][-1] not in ('0123456789'):
            window['-IT-'].update(values['-IT-'][:-1])
        if event == '-DURATION-' and values['-DURATION-'] and values['-DURATION-'][-1] not in ('0123456789'):
            window['-DURATION-'].update(values['-DURATION-'][:-1])
        
        elif event == 'Start':
            if values['-IT-'] == "" and values['-DURATION-'] == "":
                window['-IT-'].update(1)
                window['-DURATION-'].update(0)
            elif values['-IT-'] != "" and values['-DURATION-'] == "":
                window['-DURATION-'].update(0)
            elif values['-IT-'] == "" and values['-DURATION-'] != "":
                window['-IT-'].update(1)    
            move(numMin=int('0'+values['-IT-']), numDuration=int('0'+values['-DURATION-']))
    window.close()
main()
编辑: 我刚刚删掉了代码中不必要的部分。 因此,如果我没有误解,我需要使用一个线程,第二个问题对我来说不清楚,我可以在不添加零(0)的情况下键入一个空字符串吗?因为当我尝试直接进行类型转换时,它不起作用,如果我添加一个零,代码的行为就会改变。

需要“很长时间”的操作 如果您是Windows用户,您会看到Windows在其标题栏中显示“未响应”,随后会出现一个Windows弹出窗口,说明“您的程序已停止响应”。好吧,如果你愿意的话,你也可以让这个消息和弹出窗口出现!您所需要做的就是在事件循环中执行一个花费“太长”(即几秒钟)的操作

你有几个选择来处理这个问题。如果您的操作可以分解为更小的部分,那么您可以偶尔调用Window.Refresh()以避免出现此消息。例如,如果您正在运行一个循环,请将该调用与其他工作一起丢弃。这将使GUI保持愉快,窗口不会抱怨

另一方面,如果您的操作不在您的控制之下,或者您无法添加刷新调用,那么您可以使用的下一个选项是将长操作移动到线程中

“老办法” 有两个演示程序可供您查看如何做到这一点。你基本上把你的工作放在一个线程中。当线程完成时,它通过队列发送消息通知GUI。事件循环将在计时器设置为表示您希望GUI对完成的工作“响应”程度的值的情况下运行

“新方式”-
窗口。写入事件值
截至2020年7月,这一新功能目前仅在tkinter端口可用,这是令人兴奋的,它代表了PySimpleGUI中处理多线程的未来方式(希望如此)

以前,在事件循环轮询来自线程的传入消息时使用了一个队列

现在,线程可以直接将事件注入到窗口中,这样它就会显示在
窗口中。read()
调用中。这允许事件循环“挂起”,等待正常窗口事件以及线程生成的事件

您可以在这个演示中看到这个新功能的实际应用:demo\u multi-threaded\u Write\u Event\u Value.py

这是供你检查和教育的计划。不再为线程化事件进行轮询真是太好了

导入线程
导入时间
将PySimpleGUI导入为sg
"""
线程化演示-使用Window.write\u event\u值通信
需要PySimpleGUI.py版本4.25.0及更高版本
如果要在PySimpleGUI中使用多线程,这是一个非常重要的演示。
PySimpleGUI中较旧的多线程机制依赖于对队列的轮询
队列现在在PySimpleGUI内部执行。
使用新window.write\u event\u value调用的重要性再怎么强调也不为过。它将产生巨大的影响
一个积极的方法是,在您的代码上移动到此机制,因为您的代码将只是“挂起”等待事件,而不是轮询。
版权所有2020 PySimpleGUI.org
"""
线程事件='-THREAD-'
cp=sg.cprint
定义_线程(窗口):
"""
通过窗口事件与应用程序通信的线程。
每秒唤醒一次,并向窗口发送新事件和关联值
"""
i=0
尽管如此:
时间。睡眠(1)
window.write_event_value('-THREAD-',(threading.current_THREAD().name,i))#发送的数据是线程名称和计数器的元组
cp('这是来自线程的欺骗',c='白色在绿色')
i+=1
def main():
"""
演示将在多行信息中显示正在运行的事件和值字典
从window.read()返回
每次单击“开始”都会启动一个新线程
尝试单击“Dummy”查看窗口是否处于活动状态,同时线程正在后台进行
"""
布局=[[sg.Text('Output Area-cprint's route to here',font='Any 15')],
[sg.Multiline(size=(65,20),key='-ML-',autoscroll=True,reroute\u stdout=True,write\u only=True,reroute\u cprint=True)],
[sg.T('输入以便在字典中查看数据'),
[sg.Input(键='-IN-',大小=(30,1))],
[sg.B('Start A Thread')、sg.B('Dummy')、sg.Button('Exit')]]
window=sg.window('windowtitle',layout,finalize=True)
为True时:#事件循环
事件,值=window.read()
cp(事件、值)
如果事件==sg.WIN\u关闭或事件==退出:
打破
如果event.startswith('Start'):
threading.Thread(target=线程,args=(窗口),daemon=True).start()
如果事件==线程事件:
cp(f'线程数据',颜色='紫色上的白色',结束='')
cp(f'{values[THREAD_EVENT]}',colors='white on red')
window.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
多线程程序 关于多线程主题,准备了另一个演示,演示如何在程序中运行多个线程,这些线程都与事件循环通信,以便在GUI窗口中显示某些内容。回想一下,对于PySimpleGUI(至少是tkinter端口),您不能创建PySimpleGUI