2013-04-25 158 views
0

我有一個Kivy應用程序。如何在kivy中使用阻塞MessgeBox

從主GUI中,我想打開一個新的消息框並強制主GUI等待操作框交互的結果。

我看到Qt4消息框支持這種阻塞調用類型,但我還沒有在Kivy中找到等價的功能。這種功能是否存在?

回答

2

彈出窗口小部件用於創建模式彈出窗口。默認情況下,彈出窗口將覆蓋整個「父窗口」。當你創建一個彈出窗口時,你必須至少設置一個Popup.title和一個Popup.content小部件。

模裝置阻止:)

http://kivy.org/docs/api-kivy.uix.popup.html

+0

我的意思是:打開彈出後。我希望主要流程捕獲彈出窗口上的用戶操作。例如:popup有3個按鈕:按鈕A,按鈕B和按鈕C.我希望主流等待哪個按鈕單擊彈出。這是在JavaScript中的警報功能相同的過程。請幫幫我。謝謝。 – 2013-04-25 04:03:45

+0

我被要求不使用回調函數來通知從彈出消息箱到主要gui的變化。 – 2013-04-25 04:09:35

+0

http://kivy.org/docs/api-kivy.uix.modalview.html#kivy.uix.modalview.ModalView可能是你想要的...一個模態視圖將被阻止,直到它被告知關閉...或者我不明白你在問什麼.... – 2013-04-25 04:14:47

0

下面的代碼片段,其沒有工作,雖然它實際上是沒有真正阻擋。 您需要定義一個或兩個替代方案才能繼續使用 程序。這是僞阻塞技巧。

import kivy 
from kivy.uix.popup import Popup 
from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label 
from kivy.app import App 

class MessageBoxApp(App): 

    def build(self): 
     return Button(text='Press for MessageBox!', on_press=self.callpopup) 

    def callpopup(self, event): 
     dlg = MessageBox(self, titleheader="Title Header", message="Any Message", 
     options={"YES": "printyes()", "NO": "printno()", "CANCEL": ""}) 
     print "Messagebox shows as kivy popup and we wait for the user action" 

    def printyes(self): 
     # routine for going yes 
     print "You chose the Yes routine" 

    def printno(self): 
     # routine for going no 
     print "You chose the No routine" 

class MessageBox(MessageBoxApp): 
    def __init__(self, parent, titleheader="Title", message="Message", options={"OK": ""}, size=(400, 400)): 

     def popup_callback(instance): 
      "callback for button press" 
      self.retvalue = instance.text 
      self.popup.dismiss() 

     self.parent = parent 
     self.retvalue = None 
     self.titleheader = titleheader 
     self.message = message 
     self.options = options 
     self.size = size 
     box = GridLayout(orientation='vertical', cols=1) 
     box.add_widget(Label(text=self.message, font_size=16)) 
     b_list = [] 
     buttonbox = BoxLayout(orientation='horizontal') 
     for b in self.options: 
      b_list.append(Button(text=b, size_hint=(1,.35), font_size=20)) 
      b_list[-1].bind(on_press=popup_callback) 
      buttonbox.add_widget(b_list[-1]) 
     box.add_widget(buttonbox) 
     self.popup = Popup(title=titleheader, content=box, size_hint=(None, None), size=self.size) 
     self.popup.open() 
     self.popup.bind(on_dismiss=self.OnClose) 

    def OnClose(self, event): 
     self.popup.unbind(on_dismiss=self.OnClose) 
     self.popup.dismiss() 
     if self.retvalue != None and self.options[self.retvalue] != "": 
      command = "self.parent."+self.options[self.retvalue] 
      exec command 

if __name__ == '__main__': 
    MessageBoxApp().run()