Kivy:弹出窗口不显示

托马斯·维克斯·皮尔尼(Tomas Viks Pilny)

虽然我的示例代码不是最短的代码之一,但是它是展示我的App内部工作的最小代码。

我的目标是要有一个保存弹出对话框来更新进度条(在此示例中不是,不是问题)。如果您尝试运行此代码,则将看到“保存”按钮-单击后将显示弹出窗口。

但是我突然progress_bar()方法中出现了更新循环,突然不再显示Popup了-为什么?

我正在互联网上寻找解决方案。最初,我认为这与我在实际将文件保存到另一个线程时更新弹出窗口有关,但是此示例没有线程,并且注释了实际方法,因此问题必须在其他地方。

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from time import sleep

# Main app with save method
class MainApp(App):
  def build(self):
    sm = ScreenManager()
    self.save = save(app=self, name='save')
    sm.add_widget(self.save)
    self.saved_percent = 0.0
    return sm

  def save_file(self,file_path):
    for i in range(0,10):
      sleep(1)
      self.saved_percent = i * 10.0
      print("saved",i)
    self.save_finnished = True
    return 256 # check for written bytes

# one of many screens - this one is for saving
class save(Screen):
  def __init__(self, app, **kwargs):
    super(Screen,self).__init__(**kwargs)
    self.app = app
    lyo = BoxLayout(orientation='vertical')
    btn = Button(text="Save", size=(10,10))
    btn.bind(on_press=self.begin_save)
    lyo.add_widget(btn)
    self.add_widget(lyo) # basic layout to init the save

  def begin_save(self,*args):
    self.app.save_finnished = False
    self.cancel_save = False
    file_path = 'foo.txt' # debug static
    self.progress_bar(file_path) # TODO put in separate thread and continue
    #save_file(self,file_path)

  def progress_bar(self, file_path):
    btn = Button(text="Cancel")
    btn.bind(on_press=self.btn_cancel_save)

    pop = Popup(title="Saving", content=btn, auto_dismiss=False)
    pop.open() # does not open

    # this loop is somehow causing the Popup not to display
    #while (not self.app.save_finnished and not self.cancel_save):
    #    pass # progres bar is being updated here
    #pop.dismiss() # dismiss after exiting the loop

  def btn_cancel_save(self, *args):
    print("Cancel clicked")
    self.cancel_save = True


if __name__ == "__main__":
    top=MainApp()
    top.run()



















#
#import kivy
#from kivy.app import App
#from kivy.uix.screenmanager import ScreenManager, Screen
#from kivy.uix.boxlayout import BoxLayout
#from kivy.uix.progressbar import ProgressBar
#from kivy.uix.popup import Popup
#import threading
#from kivy.uix.label import Label
#from kivy.uix.button import Button
#from kivy.uix.boxlayout import BoxLayout
#from time import sleep
#from kivy.lang import Builder
#import queue
#
## Main app with save method
#class MainApp(App):
#  def build(self):
#    sm = ScreenManager()
#    self.save = save(app=self, name='save')
#    sm.add_widget(self.save)
#    self.saved_percent = 0.0
#    return sm
#
#  def save_file(self,file_path):
#    for i in range(0,10):
#      sleep(1)
#      self.saved_percent = i * 10.0
#      print("saved",i)
#    return 256 # check for written bytes
#
## one of many screens - this one is for saving
#class save(Screen):
#  def __init__(self, app, **kwargs):
#    super(Screen,self).__init__(**kwargs)
#    self.app = app
#    lyo = BoxLayout(orientation='vertical')
#    btn = Button(text="Save", size=(10,10))
#    btn.bind(on_press=self.begin_save)
#    lyo.add_widget(btn)
#    self.add_widget(lyo) # basic layout to init the save
#
#  def begin_save(self,*args):
#    self.save_finnished = False
#    self.cancel_save = False
#    file_path = 'foo.txt' # debug static
#    #written = self.poi.save_file(file_path)
#    #self.progress_bar(file_path)
#
#    # some black magic with threads to get ret value
#    # https://www.edureka.co/community/31966/how-to-get-the-return-value-from-a-thread-using-python
#    #que = queue.Queue()
#    #t = threading.Thread(target=lambda q, arg1: q.put(self.app.save_file(arg1)), args=(que, file_path))
#    #t.start()
#    self.progress_bar(file_path)
#    #progress_bar_thread = threading.Thread(target=self.progress_bar, args=(file_path,))
#    #progress_bar_thread.start()
#    #t.join()
#    #written = que.get()
#
##    self.save_finnished = True
##    size = os.path.getsize(file_path)
##    if(not self.btn_cancel_save):
##      if(written == size):
##        print("OK")
##        self.ok_dialog(True)
##      else:
##        print("Error saving to POI")
##        self.ok_dialog(False)
#
#  def progress_bar(self, file_path):
#    print("progress bar fnc ")
#    #lyo = BoxLayout(orientation='vertical')
#    #pb = ProgressBar(max=100.0)
#    #lbl = Label(text='0 %')
#    btn = Button(text="Cancel")
#    btn.bind(on_press=self.btn_cancel_save)
#    #lyo.add_widget(Label(text=file_path))
#    #lyo.add_widget(pb)
#    #lyo.add_widget(lbl)
#    #lyo.add_widget(btn)
#
#    #pop = Popup(title="Saving", content=lyo, auto_dismiss=False)
#    pop = Popup(title="Saving", content=btn, auto_dismiss=False)
#    pop.open() # does not open
#
##    print("start update loop")
##    print("finished?",self.save_finnished, "cancel?" ,self.cancel_save)
#    while (not self.save_finnished or not self.cancel_save):
#        pass # progres bar is being updated here
##      pb.value = self.app.saved_percent
##      s =  '%.12f' % self.app.saved_percent
##      i, p, d = s.partition('.')
##      str_percent = '.'.join([i, (d+'0'*2)[:2]])
##      lbl.text = str_percent +' %'
##      #print(" # ")
#    print("out of update loop - dismiss pop")
#    pop.dismiss()
#
#  def ok_dialog(self,success):
#    if(success):
#      title = "SUCCESS"
#    else:
#      title = "FAILED"
#    btn = Button(text="OK")
#
#    pop = Popup(title=title, content=btn, auto_dismiss=False)
#    btn.bind(on_press=pop.dismiss)
#    pop.open()
#
#
#  def btn_cancel_save(self, *args):
#    print("Cancel clicked")
#    self.cancel_save = True
#
#
#if __name__ == "__main__":
#    top=MainApp()
#    top.run()
卡纳7

对于线程,我会使用类似的东西;您必须退出按钮回调,否则eventloop不会重绘窗口小部件。

import time
from threading import Thread
from kivy.uix.progressbar import ProgressBar
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout


class TestApp(App):
    def build(self):
        self.thread = None

        parent = Widget()
        btn = Button(text='copy file', on_press=self.start_thread_copy_file)
        parent.add_widget(btn)
        return parent

    def start_thread_copy_file(self, *args):
        if self.thread is None:
            # open progressbar window
            self.progress_bar = ProgressBar(max=5)
            btn = Button(text="Cancel")
            btn.bind(on_press=self.thread_copy_cancel)

            layout = BoxLayout()
            layout.add_widget(self.progress_bar)
            layout.add_widget(btn)

            self.pop = Popup(title="Saving", content=layout)
            self.pop.open()

            self.thread = Thread(target=self.thread_copy_file_func)
            self.thread.start()

    def thread_copy_cancel(self, *args):
        self.thread = None  # can be also done with a flag
        self.pop.dismiss()

    def thread_copy_file_func(self):
        try:
            for i in range(5):
                print('thread_copy_file_func i =', i)
                self.progress_bar.value = i
                time.sleep(1)
                if self.thread is None:  # cancel condition
                    break

        finally:
            self.thread = None
            self.pop.dismiss()


TestApp().run()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

弹出窗口不显示

来自分类Dev

弹出窗口不显示

来自分类Dev

Bootstrap模式弹出窗口不显示

来自分类Dev

语义UI弹出窗口不显示

来自分类Dev

HTML按钮不显示弹出窗口

来自分类Dev

使用mysqli时不显示弹出窗口

来自分类Dev

NSTokenField不显示建议弹出窗口

来自分类Dev

使用kivy在弹出窗口中显示变量

来自分类Dev

调用Games.Achievements.unlock时不显示弹出窗口

来自分类Dev

PDF Blob-弹出窗口不显示内容

来自分类Dev

在后退导航中不显示模式弹出窗口

来自分类Dev

Greybox GB_showcenter不显示弹出窗口

来自分类Dev

单击按钮时不显示ajax弹出窗口

来自分类Dev

选择微调框项目时不显示弹出窗口?

来自分类Dev

不显示“角度材料”对话框的弹出窗口

来自分类Dev

XAML ComboBox DataTemplate弹出窗口在单击时不显示

来自分类Dev

jQuery换行符不显示在消息弹出窗口上

来自分类Dev

OS X WebKit WebView不显示JS弹出窗口

来自分类Dev

单击按钮时不显示ajax弹出窗口

来自分类Dev

弹出式窗口中的Swift Tableview不显示数据

来自分类Dev

模态弹出窗口不显示在另一个模态弹出窗口的顶部

来自分类Dev

Kivy:在弹出窗口中显示的文本的相对大小

来自分类Dev

window.open打开弹出窗口而不显示窗口-行为不一致

来自分类Dev

在 Kivy 中关闭弹出窗口

来自分类Dev

如何在FXML中仅显示JavaFX DatePicker日历弹出窗口而不显示ComboBox?

来自分类Dev

弹出窗口未显示

来自分类Dev

弹出窗口显示IllegalStateException

来自分类Dev

如何显示弹出窗口

来自分类Dev

单击显示弹出窗口