python - 暂停 python 脚本,直到事件发生而不挂起/阻塞 GUI

标签 python multithreading qt modal-dialog kivy

尝试使用 Kivy 从 PyQt 迁移,我什至无法想象解决方案。

我有数千行代码使用 Qt 的对话框进行文本输入。也就是说,当到达他们的代码行时,他们会“停止”脚本,直到按下“确定”按钮,这样他们才能返回文本输入。

Kivy 没有该功能,因此理想情况下,当程序需要用户输入时,“确定”按钮将调用运行下一个函数。

因此,我必须将所有当前对 PyQt 函数的调用替换为一个函数,该函数可以停止正在运行的脚本,启动一个有效的响应对话,然后在输入请求的文本后恢复原始对话。所以问题是:

有没有办法在函数完成之前停止正在运行的脚本,不会挂起 GUI?

我已经试过了:

  • 线程:

即使我在新线程中开始文本输入:

t = threading.Thread(target=TextInput.waiter)

调用此类线程的函数将在调用文本输入后立即返回。 如果我使用这段代码:

t.start()
t.join()

主脚本将停止,但也会挂起文本输入 GUI。

  • While/Sleep:WAITING文本输入变量包含有效结果。但这会阻止 Kivy 中正在进行的文本输入 GUI

  • 破解 raw_input: 目前正在考虑尝试一些破解方法,这将允许我停止脚本,然后反馈 kivy 文本输入弹出窗口找到的输入。

非常欢迎任何指点,感谢阅读。

最佳答案

您不能只是暂停正在运行的脚本。相反,您需要将程序重构为事件驱动的(因为 Kivy 是一个事件驱动的 GUI)。

这是一个简单的示例函数:

def myfunc():
    # do some stuff here
    # now we need some input...
    val = qt_input_dialogue()
    # do some more stuff here

重构:

class MyPopup(Popup):
    value = StringProperty() # bind this to a TextInput or something

def myfunc1():
    # do some stuff here
    p = MyPopupClass()
    p.bind(on_dismiss=lambda *_: myfunc2(p.value))
    p.open()

def myfunc2(val):
    # do some more stuff here

如果您愿意使用 Twisted,您可以使用 DeferredinlineCallbacks 使这更容易。

from kivy.support import install_twisted_reactor
install_twisted_reactor()

from twisted.internet import defer

Builder.load_string('''
<MyPopup>:
    BoxLayout:
        orientation: 'vertical'
        TextInput:
            id: text_input
        BoxLayout:
            orientation: 'horizontal'
            Button:
                text: 'OK'
                on_press: root.okfn(text_input.text)
''')

class MyPopup(Popup):
    def show(self, *args):
        d = defer.Deferred()
        self.okfn = d.callback
        self.open(*args)
        return d

@defer.inlineCallbacks
def myfunc():
    # do some stuff here
    val = yield MyPopup().show()
    # do some more stuff here

这样,您只需将对 QT 输入对话框的调用替换为 yield MyPopup().show()

关于python - 暂停 python 脚本,直到事件发生而不挂起/阻塞 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23685986/

相关文章:

python - 使用 OpenCV 和 Python 从 HSV 图像检测颜色时遇到问题

python - 从 Python groupby 填充日期

c - 如果条件变量向锁定的线程发出信号怎么办?

java - 改变运行java程序的线程优先级?

Python 线程 - 意外输出

c++ - 在 Qt 中禁用 Glib 事件循环 - QT_NO_GLIB 未生效

python - PySpark 将列中的空值替换为其他列中的值

python - NumPy:在向量化分配期间评估索引数组

qt - 如何在 QtCreator 工具提示中显示 API 文档?

c++ - Qt 不是异常安全的。这对 C++ 代码有何影响?