【问题标题】:How do you make the button have focus in wxPython ScrolledMessageDialog?你如何让按钮在 wxPython ScrolledMessageDialog 中有焦点?
【发布时间】:2018-03-12 19:44:58
【问题描述】:

我使用一个简单的函数在 wxPython 4 应用程序中显示错误消息。它会在其下方显示一条消息和一个“确定”按钮:

dlg = wx.lib.dialogs.ScrolledMessageDialog(self, msg, "Error")
dlg.ShowModal()

问题:显示对话框时,输入焦点在消息上,而不是按钮上(至少在 macOS 上)。这意味着在键盘上按回车没有任何作用。如果和点击确定按钮的效果一样的话会更方便。

如何让按钮在显示此对话框时默认获得焦点?

【问题讨论】:

  • 使用滚动消息表示必须显示大量信息。在您的示例中,该消息与错误有关。如果焦点在 OK 按钮上,那么,如果人们没有集中注意力,或者他们根本懒得阅读,那么他们可能会不小心按 Enter,您认为这些信息足够重要,他们应该阅读它。它现在的运作方式至少迫使他们停下来并做出有意识的决定。我们都被告知多少次了,程序没有运行,出现错误。错误是什么?不知道我没读过。
  • @RolfofSaxony 你是对的——这是一个很好的观点。感谢您的 cmets,我今天更改了我的代码,以便它首先显示一个常规错误对话框,带有一个可选的“帮助”按钮,如果用户按下此帮助按钮,那么它会显示有关错误的更多详细信息。所以现在很难不假思索地点击,但焦点问题仍然存在于第二个对话框中。因此,我仍然发现自己希望找到解决方案。您的评论使界面更好,我很感激。

标签: python-3.x user-interface wxpython


【解决方案1】:

鉴于您的评论,为什么不创建自己的对话框。 类似于:

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Custom Dialog",size=(200,100))
        self.panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.button = wx.Button(self.panel, label="Dialog")
        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):
        msg = "Please select one of the options below\n"
        msg += "Help is available if you have encountered this issue\n"
        dlg = MessageDialog(self.panel,msg,"Message Dialog Heading")
        dlg.ShowModal()
        if dlg.result == wx.ID_HELP:
            print ("Help text was displayed")
        elif dlg.result == wx.ID_OK:
            print ("Ok was Selected")
        elif dlg.result == wx.ID_CANCEL:
            print ("Cancel was Selected")
        else:
            print ("Dialog Exited")
        dlg.Destroy()

class MessageDialog(wx.Dialog):
    def __init__(self, parent, message, title):
        wx.Dialog.__init__(self, None, -1, title)
        ok = wx.Button(self, wx.ID_OK)
        no = wx.Button(self, wx.ID_CANCEL)
        help = wx.Button(self, wx.ID_HELP)
        self.text = wx.StaticText(self, -1, message)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(self.text,1,0,0)
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        hbox2.Add(ok,0,0,0)
        hbox2.Add(no,0,0,0)
        hbox2.Add(help,0,0,0)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(hbox, 0, wx.ALIGN_CENTER)
        vbox.Add(hbox2, 0, wx.ALIGN_CENTER)
        self.SetSizer(vbox)
        self.Bind(wx.EVT_BUTTON,self.OnButton)
        self.Bind(wx.EVT_CLOSE,self.OnExit)
        self.result = None
        help.SetFocus()

    def OnButton(self,event):
        self.result = event.GetId()
        if event.GetId() == wx.ID_HELP:
            wx.MessageBox('This is my help text dialog', 'Help',wx.OK | wx.ICON_INFORMATION)
        self.Destroy()

    def OnExit(self,event):
        self.result = None
        self.Destroy()

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

【讨论】:

    【解决方案2】:

    创建自定义对话框窗口时,您需要使用wx.Button.SetDefault() 将焦点设置在按钮上,至少在 macOS 上是这样。例如:

    class MyCustomDialog(wx.Dialog):
        """"""
        def __init__(self, parent, title=''):
            """"""
            super().__init__(parent, title=title)
            #region ------------------------------------------------------ Widgets
            #--> StaticText
            self.stText = wx.StaticText(
                self, 
                label="The label"
            )
            #--> TextCtrl
            self.tcText = wx.TextCtrl(
                self, 
                value="The values",
                size=(300, 23),
            )
            #--> CheckBox
            self.cbLogP  = wx.CheckBox(self, label='Check A')
            self.cbCorrP = wx.CheckBox(self, label='Check B')
            #--> Buttons
            self.btnOK     = wx.Button(self, wx.ID_OK)
            self.btnCancel = wx.Button(self, wx.ID_CANCEL)
    
            #### The line below is the one that set the focus on the Ok button ####
            self.btnOK.SetDefault()
    
            #endregion --------------------------------------------------- Widgets
    
            #region ------------------------------------------------------- Sizers
            self.sizer = wx.BoxSizer(wx.VERTICAL)
    
            self.sizer.Add(self.stText, 0, wx.ALL, 5)
            self.sizer.Add(self.tcText, 0, wx.ALL, 5)
    
            self.box_check = wx.BoxSizer(wx.HORIZONTAL)
            self.box_check.Add(self.cbLogP, 0, wx.ALL, 5)
            self.box_check.Add(self.cbCorrP, 0, wx.ALL, 5)
            self.sizer.Add(self.box_check, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 5)
    
            self.sizer_btn = wx.StdDialogButtonSizer()
            self.sizer_btn.AddButton(self.btnOK)
            self.sizer_btn.AddButton(self.btnCancel)
            self.sizer_btn.Realize()
            self.sizer.Add(self.sizer_btn, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
    
            self.SetSizer(self.sizer)
            self.sizer.Fit(self)
            #endregion --------------------------------------------------- Sizers
        #---
    #---
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多