【问题标题】:Bind “Enter” key to WXPython "AquaButton" Button with Focus将“Enter”键绑定到带有焦点的 WXPython“AquaButton”按钮
【发布时间】:2020-09-24 01:22:15
【问题描述】:

我是这个网站的新手,对 Python 也很陌生。我正在开发一个使用 wxPython 作为 GUI 的程序。这正在开发中,将在 Windows 操作系统机器上使用。 GUI 使用许多按钮来触发我的脚本中的不同进程。我决定尝试使用 AGW AquaButtons 来获得视觉效果。我发现带有焦点的“AquaButton”不会响应按“Enter”键,而标准的“wx.Button”会响应。以下是工作代码和非工作代码的示例(主要是从类似问题中借来的,感谢“Rolf of Saxony”和“Mike Driscoll”)。

有没有办法让“AquaButton”(带焦点)的事件由“Enter”键触发?

这行得通:

    import wx

    class Example(wx.Frame):
        def __init__(self, parent, title):
            frame = wx.Frame.__init__(self, parent, title=title, )
            self.panel = wx.Panel(self, -1, size=(200,100))
            self.btn1 = wx.Button(self.panel, label='Button 1', id=1)
            self.btn1.SetForegroundColour("black")
            self.btn2 = wx.Button(self.panel, label='Button 2', id=2)
            self.btn2.SetForegroundColour("black")

            self.sizer = wx.GridBagSizer(0, 0)
            self.sizer.Add(self.btn1, pos=(0, 0), flag=wx.ALIGN_CENTER)
            self.sizer.Add(self.btn2, pos=(1, 0), flag=wx.ALIGN_CENTER)

            self.text_box = wx.StaticText(self.panel, style = wx.NO_BORDER)
            self.text_box.SetFont(wx.Font(14, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
            self.text_box.SetForegroundColour((40,115,180))
            self.sizer.Add(self.text_box, pos=(2,0), flag=wx.ALIGN_CENTER)

            self.Bind(wx.EVT_BUTTON, self.button_press)

            self.panel.SetSizer(self.sizer)
            self.Show()

        def button_press(self, event):
            Id = event.GetId()
            print ('Click Button',str(Id))
            retVal = F"Click Button {Id}"
            self.text_box.SetLabel(str(retVal))


    class AppMenu(wx.App):
        def OnInit(self):
            'Create the main window and insert the custom frame'
            frame = Example(None, 'Example')
            frame.Show(True)

            return True

    app = AppMenu()
    app.MainLoop()

这不是:

    import wx
    import wx.lib.agw.aquabutton as AB

    class Example(wx.Frame):
        def __init__(self, parent, title):
            frame = wx.Frame.__init__(self, parent, title=title, )
            self.panel = wx.Panel(self, -1, size=(200,100))
            self.btn1 = AB.AquaButton(self.panel, label='Button 1', id=1)
            self.btn1.SetForegroundColour("black")
            self.btn2 = AB.AquaButton(self.panel, label='Button 2', id=2)
            self.btn2.SetForegroundColour("black")

            self.sizer = wx.GridBagSizer(0, 0)
            self.sizer.Add(self.btn1, pos=(0, 0), flag=wx.ALIGN_CENTER)
            self.sizer.Add(self.btn2, pos=(1, 0), flag=wx.ALIGN_CENTER)

            self.text_box = wx.StaticText(self.panel, style = wx.NO_BORDER)
            self.text_box.SetFont(wx.Font(14, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))
            self.text_box.SetForegroundColour((40,115,180))
            self.sizer.Add(self.text_box, pos=(2,0), flag=wx.ALIGN_CENTER)

            self.Bind(wx.EVT_BUTTON, self.button_press)

            self.panel.SetSizer(self.sizer)
            self.Show()

        def button_press(self, event):
            Id = event.GetId()
            print ('Click Button',str(Id))
            retVal = F"Click Button {Id}"
            self.text_box.SetLabel(str(retVal))


    class AppMenu(wx.App):
        def OnInit(self):
            'Create the main window and insert the custom frame'
            frame = Example(None, 'Example')
            frame.Show(True)

            return True

    app = AppMenu()
    app.MainLoop()

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案1】:

    奇怪的是,AquaButton 是使用空格键而不是 Enter 键按下的。
    导航似乎是通过箭头键和/或 Tab 和 Shift Tab。
    如有疑问源代码在:
    your_python_location/dist-packages/wx/lib/agw/aquabutton.py

    如果不是为您的用户,我希望这可以为您解决问题。 :)

    【讨论】:

    • agw 中可能存在的错误?
    • 感谢@RolfofSaxony!我不在乎承认我花了多长时间才弄清楚功能差异是由 AquaButton 引起的,但我永远不会弄清楚整个空格键的事情。修改库中的绑定是一个选项,还是不行。
    • @JohnB 如果您将aquabutton.py 复制到您的本地目录并在那里编辑它,根据您的要求,没有什么可以阻止您将它包含在您的包中。最好将其命名为 jb_aquabutton.py,以便您以后知道其中的区别。
    • @Igor 我不这么认为。代码非常具体,尽管我无法完全理解它。
    • @RolfofSaxony 我继续创建了一个“aquabutton2”,并且能够修改一些我不关心的行为。我花了一分钟才弄清楚“== ord(”“)”是什么意思,但是用“== wx.WXK_RETURN”代替它就可以了。再次感谢您的帮助!
    猜你喜欢
    • 2018-10-03
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多