2017-03-08 2 views
0

J'ai créé la boîte de dialogue pybusyinfo pour afficher le message et après 30 secondes de sommeil, elle se ferme automatiquement.wxpython-pouvons-nous ajouter un bouton ok sur le dialogue pybusyinfo?

Maintenant, j'ai besoin d'ajouter le bouton OK dans cette boîte de dialogue pour obtenir l'entrée de l'utilisateur et ils ne sont pas pressés le bouton le dialogue devrait se fermer en 30 secondes. Peut-on ajouter ce bouton dans le dialogue wx.lib.agw.pybusyinfo?

Ou existe-t-il une autre boîte de dialogue de widgets wx qui se ferme automatiquement après un certain temps?

import wx 
import wx.lib.agw.pybusyinfo as PBI 
retVal = showmsg("dialog will be closed in 30 secs...") 
time.sleep(30) 
retVal = None 

def showmsg(msg): 
    app = wx.App(redirect=False) 
    title = 'Message!' 
    retVal = PBI.PyBusyInfo(msg, title=title) 
    return retVal 

Répondre

2

Écrivez votre propre boîte de dialogue occupée qui contient une jauge pour indiquer qu'elle est occupée.
Utilisez un wxTimer pour boucler le jaugeage.
Cela devrait vous aider à démarrer:

import wx 
class MyFrame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, -1, "Busy Dialog",size=(500,200)) 
     self.panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.log = wx.TextCtrl(self.panel, wx.ID_ANY, size=(400,100),style = wx.TE_MULTILINE|wx.TE_READONLY|wx.VSCROLL) 
     self.button = wx.Button(self.panel, label="Click me") 
     sizer.Add(self.log, 0, wx.EXPAND | wx.ALL, 10) 
     sizer.Add(self.button, 0, wx.EXPAND | wx.ALL, 10) 
     self.panel.SetSizer(sizer) 
     self.Bind(wx.EVT_BUTTON, self.OnButton) 

    def OnButton(self,event): 
     dlg = Busy(parent = self.panel) 
     dlg.ShowModal() 
     if dlg.result_text: 
      self.log.AppendText("Text Input: "+dlg.result_text+"\n") 
     dlg.Destroy() 

class Busy(wx.Dialog): 
    def __init__(self, parent): 
     wx.Dialog.__init__(self, parent, wx.ID_ANY, "Busy", size= (420,240)) 
     self.panel = wx.Panel(self,wx.ID_ANY) 
     self.label = wx.StaticText(self.panel, label="Input", pos=(20,20)) 
     self.textinput = wx.TextCtrl(self.panel, value="", pos=(80,20), size=(300,-1)) 
     self.gauge = wx.Gauge(self.panel,size=(300,20),pos=(80,80), style=wx.GA_HORIZONTAL) 
     self.livelabel = wx.StaticText(self.panel, label="Time to live:", pos=(80,110)) 
     self.lltime = wx.StaticText(self.panel, label="30", pos=(160,110)) 
     self.saveButton =wx.Button(self.panel, label="Save Input", pos=(80,160)) 
     self.closeButton =wx.Button(self.panel, label="Cancel", pos=(180,160)) 
     self.timeoutButton =wx.Button(self.panel, label="Timer Off", pos=(280,160)) 
     self.saveButton.Bind(wx.EVT_BUTTON, self.SaveBusyString) 
     self.closeButton.Bind(wx.EVT_BUTTON, self.OnQuit) 
     self.timeoutButton.Bind(wx.EVT_BUTTON, self.OnNoTimeout) 
     self.Bind(wx.EVT_CLOSE, self.OnQuit) 
     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER,self.OnTimer, self.timer) 
     self.lifetimer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER,self.OnLifeTimer, self.lifetimer) 
     self.timer.Start(100) 
     self.lifetimer.Start(1000) 
     self.timeoutbutton_pressed = False 
     self.gauge.SetBackgroundColour(wx.Colour(0, 127, 255, 255)) #Slate Blue 
     self.gauge.SetRange(100) 
     self.gauge.SetValue(0) 
     self.life = 30 
     self.direction = 1 
     self.Show() 

    def OnTimer(self, evt): #Update gauge 
     x = int(self.gauge.GetValue()) 
     if x == 0: 
      self.direction = 1 
     elif x == 100: 
      self.direction = -1 
     x+=self.direction 
     self.gauge.SetValue(x) 

    def OnLifeTimer(self, evt): #Update time to live 
     if self.timeoutbutton_pressed == True: 
      return 
     self.life -= 1 
     self.lltime.SetLabelText(str(self.life)) 
     if self.life < 1: 
      self.OnQuit(None) 

    def OnNoTimeout(self, evt): # toggle time to live 
     if self.timeoutbutton_pressed == False: 
      self.timeoutbutton_pressed = True 
      self.timeoutButton.SetLabel("Timer On") 
     else: 
      self.timeoutbutton_pressed = False 
      self.timeoutButton.SetLabel("Timer Off") 

    def OnQuit(self, event): 
     self.timer.Stop() 
     self.lifetimer.Stop() 
     self.result_text = None 
     self.Destroy() 

    def SaveBusyString(self, event): # return input 
     self.result_text = self.textinput.GetValue() 
     self.timer.Stop() 
     self.lifetimer.Stop() 
     self.Destroy() 

app = wx.App() 
frame = MyFrame(None) 
frame.Show() 
app.MainLoop() 

Edit:
Vous avez besoin d'un cadre parce que le dialogue a besoin d'un parent, de sorte que le plus simple est de faire un cadre que vous ne pouvez pas voir.
Perdez la classe MyFrame dans ce qui précède et changer la section app de code à quelque chose comme ceci:

app = wx.App() 
frame = wx.Frame(None,-1,"",size=(1,1)) 
frame.Show() 
dlg = Busy(parent = frame) 
dlg.ShowModal() 
print dlg.result_text # Do whatever here with the result I just print it 
dlg.Destroy() 
+0

Oh c'est great..Working comme charming..But Je ne veux Frame.Just dialog.Can je reçois renvoie la valeur de dialogue sans cadre? – Nithya

+0

Vous avez besoin de la classe 'busy' et du code défini dans la section' OnButton', bien que vous deviez définir le paramètre 'parent' sur une valeur correspondant à votre code. –

+0

Je veux directement ouvrir la boîte de dialogue occupée et cliquez sur n'importe quel bouton et obtenir la valeur de la classe pour passer en paramètre à une autre fonction .. Pouvez-vous m'aider à obtenir ce pls? – Nithya