如何解决如何防止我的程序冻结?
我决定最终在一个项目上工作,因为我之前尝试过用 python 编写代码,至少取得了一些成功。在我的项目中,我试图构建一个菜单,让我在游戏中“自动农场”。它使用 3 个模块,即 pynput
、pause
和 PySimpleGUI
。
每当我运行代码时,它都运行良好,直到我单击启动自动化部分的按钮。它运行完全正常,但我必须强制关闭显示的 GUI 提示,因为它完全停止响应输入,直到您关闭它。
如何制作一个停止按钮,并阻止我的程序冻结?
我使用 2 个文件来使这个项目更有条理,尽管我不知道这是否是最好的方法。这两个文件是 main.py
和 chand.py
。
main.py
import PySimpleGUI as sg
import chand
loop = 0
layout = [[sg.Text("Welcome to RedGrowie's autofarm menu!")],[sg.Button("Chandeliers")]]
window = sg.Window("Autofarming Menu",layout)
while True:
event,values = window.read()
if event == sg.WIN_CLOSED:
break
if event == "Chandeliers":
loop = 1
if loop == 1:
chand.Chandeliers.start(self=chand.Chandeliers)
window.close
chand.py
from pynput.keyboard import Key,Controller
import pause
keyboard = Controller()
start = "0"
class Chandeliers:
def d_press(self):
keyboard.press("d")
pause.milliseconds(70)
keyboard.release("d")
pause.milliseconds(300)
keyboard.release(Key.space)
def space_press(self):
keyboard.press(Key.space)
pause.milliseconds(1)
#keyboard.release(Key.space)
def start(self):
start = "1"
while start == "1":
self.d_press(self)
self.space_press(self)
解决方法
您的 Chandeliers.start
函数无限循环,因此 main.py
中主循环的调用永远不会返回。如果您希望两个循环同时运行,您可能需要使用 threading
或其他一些并发方式。或者,您可以以某种方式交错两个循环,具体取决于每个循环的时序要求。
附带说明,您以一种非常奇怪的方式使用 Chandeliers
类。您永远不会创建类的实例,而是像调用类方法一样调用它定义的方法(但手动传递类,在名称有误导性的 self
参数中。
你可能不应该那样做。要么将类视为普通类,然后创建一个实例:
cha = chand.Chandeliers()
chat.start() # and change start to not manually pass self any more
或者你应该把不需要的类一起去掉,把方法变成顶级函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。