2017-03-08 57 views
0

我已经创建了pybusyinfo对话框来显示消息,休眠30秒后它会自动关闭。wxpython - 我们可以在pybusyinfo对话框上添加ok按钮吗?

现在我需要在该对话框中添加ok按钮来获取用户输入,并且他们没有按下对话框应该在30秒内关闭的按钮。

我们可以将该按钮添加到wx.lib.agw.pybusyinfo对话框吗?

或者是否有任何其他wx小部件的对话框会在某个时间后自动关闭?

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 

回答

2

编写您自己的忙碌对话框,其中包含一个标尺以显示它正忙。
使用wxTimer来循环显示。
这应该让你开始:

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() 

编辑:
你需要一个框架,因为该对话框需要父母,所以最简单的方法是使你不能看到一个框架。
失去MyFrame类在上面,并更改代码app部分是这样的:

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

哦,这是great..Working像charming..But我不想Frame.Just dialog.Can我得到从没有框架的对话框返回值? – Nithya

+0

虽然您需要将“parent”参数设置为与您的代码相关的值,但您需要“忙碌”类和“OnButton”部分中定义的代码。 –

+0

我想直接打开繁忙的对话框,并单击任何按钮,并获得值的课堂作为参数传递给其他一些功能..你可以帮我得到那些? – Nithya

相关问题