【问题标题】:Get user input from a dialog before showing the mainframe在显示大型机之前从对话框中获取用户输入
【发布时间】:2016-04-06 21:11:25
【问题描述】:

我有 wxPython GUI 程序,它必须从用户那里获得输入才能运行。我想在主框架之前显示对话框,存储输入,关闭对话框,然后运行主程序。现在我正在使用 raw_input 代替。这是我的代码:

import wx
import wx.lib.iewin as iewin
import subprocess

class MyBrowser(wx.Frame):
  def __init__(self, parent, id):
    wx.Frame.__init__(self, parent, id, 
                       style=wx.DEFAULT_FRAME_STYLE | wx.STAY_ON_TOP)
    self.transparency = 255

    sizer = wx.BoxSizer(wx.VERTICAL)
    self.browser =  iewin.IEHtmlWindow(self)
    sizer.Add(self.browser, 1, wx.EXPAND, 10)

    self.Bind(wx.EVT_CHAR_HOOK, self.onKey)

  def SetTransparent(self, value):
    self.transparency = value
    wx.Frame.SetTransparent(self, value) 

  def GetTransparent(self):
    return self.transparency   

  def decreaseTransparency(self, e):
    self.SetTransparent(self.GetTransparent() - 10) 
  def increaseTransparency(self, e):
    self.SetTransparent(self.GetTransparent() + 10)  


  def onKey(self, evt):
    if evt.GetKeyCode() == wx.WXK_DOWN:
      self.decreaseTransparency(self)
    elif evt.GetKeyCode() == wx.WXK_UP:
      self.increaseTransparency(self)
    else:
      evt.Skip()    

  def load(self,uri):
     self.browser.Navigate(uri)

#starts livestreamer process
response = raw_input("Livestreamers name:\n")
livestreamer = "livestreamer twitch.tv/"
host = subprocess.Popen(['livestreamer', 'twitch.tv/'+response, 'best'],    stdout=subprocess.PIPE)

if __name__ == '__main__':
app = wx.App()
dialog = MyBrowser(None, -1)
dialog.browser.Navigate("https://www.twitch.tv/" + response+ "/chat?popout=")
dialog.Show()
app.MainLoop()
host.communicate()[0]

这就是我的想法: dialog example

【问题讨论】:

    标签: python python-2.7 wxpython


    【解决方案1】:

    在你的浏览器初始化创建一个对话框,在上面运行 ShowModal,然后使用 dialog.GetValue 获取输入

    class MyBrowser(wx.Frame):
        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id,
                       style=wx.DEFAULT_FRAME_STYLE | wx.STAY_ON_TOP)
            self.transparency = 255
            self.dialog = wx.TextEntryDialog(None, message="Enter stuff")
            self.dialog.ShowModal()
            print self.dialog.GetValue()
            self.Bind(wx.EVT_CHAR_HOOK, self.onKey)
    

    显然将打印替换为您想要对值执行的任何操作

    如果您想在 MyBrowser 对象实例化后访问它,请将其分配为实例变量而不是打印。

    class MyBrowser(wx.Frame):
        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id,
                       style=wx.DEFAULT_FRAME_STYLE | wx.STAY_ON_TOP)
            self.transparency = 255
            self.dialog = wx.TextEntryDialog(None, message="Enter stuff")
            self.dialog.ShowModal()
            self.dlg_val = self.dialog.GetValue()
            self.Bind(wx.EVT_CHAR_HOOK, self.onKey)
    

    然后再往下用

    if __name__ == "__main__":
        dialog = MyBrowser(None)
        print dialog.dlg_val
    

    【讨论】:

    • 我很抱歉我的无知,但是我如何从那个类之外调用 self.dialog.GetValue() 呢?这是一个很好的答案,但我似乎无法整合它。
    • 编辑了我的答案,向您展示如何在课堂外使用它
    • 很高兴它成功了!我还想推荐获取“wxPython 2.8 Application Development Cookbook”。这是使用 wxPython 进行开发的绝佳资源。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多