【问题标题】:Open kivy popup before continuing在继续之前打开 kivy 弹出窗口
【发布时间】:2019-08-30 19:37:19
【问题描述】:

在我的方法中的其余代码完成运行之前,我的 kivy 弹出窗口不会出现在屏幕上。我正在尝试显示一个进度条,因此它在当前状态下毫无价值。

我已尝试线程化进程以打开弹出窗口并尝试不使用线程。

from kivy.uix.progressbar import ProgressBar
from kivy.uix.popup import Popup
import threading

def submit():
    popup = Popup(title='Submit Progress', content=ProgressBar())
    thread_object = threading.Thread(target=popup.open)
    thread_object.start()
    perform some iterable actions 
       increment progress bar value

    if progress_bar.value == progress_bar.max:
        popup.auto_dismiss = True
        # This is when the popup finally appears

我需要我的弹出窗口的打开功能在执行可迭代操作之前真正生效,以便用户可以看到进度

【问题讨论】:

  • 您试图在线程中打开弹出窗口并在主线程中运行您的处理,但这是错误的方法。在主线程中打开弹出窗口,然后在另一个线程中运行递增过程。
  • 我已尝试按照您的建议更改为相反的结果,结果完全相同。你能解释一下为什么你说它应该是这种方式而不是另一种方式吗?为什么这有关系?它可以帮助我了解我还需要切换什么。 @inclement

标签: python-3.x kivy


【解决方案1】:

这是基于成员“恶劣”的回答。 我不是 100% 你想要做的事情,但这里有一些我测试过的代码,它在自己的线程中启动一个长时间运行的任务,并保持弹出窗口打开,直到该任务完成。

Kivy .kv 文件条目

Button:
    text: "do..."
    on_release: app.root.info_popup(self)  # your app may need root.info_popup(self)

在应用程序中,目标方法

def info_popup(self, _button: Button):
    print(str(type(_button)))
    popup_content = ProgressBar(max=10)

    popup = Popup(title="Countdown",
                  size_hint=(None, None), size=(400, 180),
                  content=popup_content,
                  auto_dismiss=False)
    print("starting a new thread to do the countdown")
    threading.Thread(target=partial(self.update_progress, an_object=popup_content,
                                    the_popup=popup), daemon=True).start()
    popup.open()

将这个函数作为自己的线程启动

def update_progress(self, an_object, the_popup: Popup):
    for i in range(10, -1, -1):
        time.sleep(1.0)
        print("progress: {}".format(i))
        an_object.value = i
    the_popup.dismiss()
    print("I have dismissed the popup")

【讨论】:

  • 这对我不起作用。在其余线程完成之前,我的弹出窗口仍然拒绝打开。
  • Alex,您是在主代码中通过按钮或类似方式打开弹出窗口吗?这是在 windows/linux/mac 上还是在您作为手机应用程序运行时发生?我粘贴的示例在 Windows 上运行,但它被拼接到我已经运行的应用程序中。设置线程的目标变量时要非常小心,不要执行它 target=myfun() 是错误的并且是常见错误,但 target=mufun 是正确的。
  • 我正在从我的主代码中的一个方法打开,该方法是通过按下按钮调用的。我没有在我的 target= 代码段中使用 () 。 popup.open() 调用直到稍后才打开弹出窗口,无论我是否线程化我的其余代码。我的应用程序中有其他弹出窗口在调用时打开,正如预期的那样......
  • 忘记添加这是在 windows 上的。
【解决方案2】:

我通过使用 Clock.schedule_once() 函数来安排我的其他线程更新解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多