禁用Python wx中单选按钮标签的视觉强调?

时间:2015-01-06 02:48:19

标签: python wxpython wxwidgets

使用下面发布的代码(使用wxglade生成,使用wxPython 2.8.11.0,Python 2.7.1 +,Ubuntu 11.04测试),我得到了这个输出:

test.png

即使我在实例化过程中从标签中删除了文本,按下按钮时标签仍然仍然呈现!我怎样才能消除这种影响;是否可以仅禁用标签,同时保持单选按钮整体活动?我只是不想要无线电按钮圆圈所呈现的任何其他东西,无论它是否被选中。

编辑:刚刚发现由radiobutton圈呈现的小矩形显然是为了聚焦;所以问题可能是:是否可以禁用单选按钮的指示,同时保留所有其他功能?

EDIT2:旁边的问题:如何获得按钮'圆圈始终位于其间隔中间?显然,wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL不起作用(尝试水平调整窗口,它们似乎仍然保持对齐)

代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Tue Jan  6 03:40:06 2015

import wx

# begin wxGlade: extracode
# end wxGlade

class MyFrame(wx.Frame):
  def __init__(self, *args, **kwds):
    # begin wxGlade: MyFrame.__init__
    kwds["style"] = wx.DEFAULT_FRAME_STYLE
    wx.Frame.__init__(self, *args, **kwds)
    self.radio_btn_1 = wx.RadioButton(self, -1, "")
    self.radio_btn_2 = wx.RadioButton(self, -1, "")
    self.radio_btn_3 = wx.RadioButton(self, -1, "")

    self.__set_properties()
    self.__do_layout()
    # end wxGlade

  def __set_properties(self):
    # begin wxGlade: MyFrame.__set_properties
    self.SetTitle("Test Radiobuttons")
    self.SetSize((160, 100))
    # end wxGlade

  def __do_layout(self):
    # begin wxGlade: MyFrame.__do_layout
    sizer_1 = wx.BoxSizer(wx.VERTICAL)
    sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_2.Add(self.radio_btn_1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_2.Add(self.radio_btn_2, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_2.Add(self.radio_btn_3, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_1)
    self.Layout()
    # end wxGlade

# end of class MyFrame


if __name__ == "__main__":
  app = wx.PySimpleApp(0)
  wx.InitAllImageHandlers()
  frame_1 = MyFrame(None, -1, "")
  app.SetTopWindow(frame_1)
  frame_1.Show()
  app.MainLoop()

1 个答案:

答案 0 :(得分:0)

好吧,我认为我得到了这个,包括聚焦/视觉强调和中心:

test.png

  • 对于聚焦,我设置单选按钮以绑定EVT_SET_FOCUS;然后,我已经实例化 - 但没有放置 - 一个空的面板;然后,一旦焦点处理程序命中,我将焦点设置为未放置的面板;这似乎消除了视觉焦点
  • 对于居中,实际上有这样的结构非常重要:

wxglade.png

......那就是:你首先有一个3向水平尺寸;但在它内部,它的第一级孩子必须是(单向)垂直分级器 - 并且 none 这些可以设置为wx.EXPAND!然后,相对于水平尺寸调整器对齐子纵向尺寸调整器wx.ALIGN_CENTER_VERTICAL - 并且它们内部的单选按钮对齐wx.ALIGN_CENTER_HORIZONTAL。

以下是现在正在运行的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Tue Jan  6 03:40:06 2015

# [http://osdir.com/ml/wxpython-users/2010-03/msg00619.html wxpython-users - Re: [wxPython-users] Re: Possible to prevent focus on a wx.TextCtrl? - msg#00619 - Recent Discussion OSDir.com]

import wx

# begin wxGlade: extracode
# end wxGlade

class MyFrame(wx.Frame):
  def __init__(self, *args, **kwds):
    # begin wxGlade: MyFrame.__init__
    kwds["style"] = wx.DEFAULT_FRAME_STYLE
    wx.Frame.__init__(self, *args, **kwds)
    self.focpanel = wx.Panel(self, -1) # just has to exist, doesn't need to be added anywhere in the frame - will still take away the focus
    self.radio_btn_1 = wx.RadioButton(self, -1, "")
    self.radio_btn_2 = wx.RadioButton(self, -1, "")
    self.radio_btn_3 = wx.RadioButton(self, -1, "")

    self.radio_btn_1.Bind(wx.EVT_SET_FOCUS, self.killFocus) #not EVT_ACTIVATE
    self.radio_btn_2.Bind(wx.EVT_SET_FOCUS, self.killFocus)
    self.radio_btn_3.Bind(wx.EVT_SET_FOCUS, self.killFocus)

    self.__set_properties()
    self.__do_layout()
    # end wxGlade

  def killFocus(self, event):
    #print("AAA" + str(event))
    self.focpanel.SetFocus()

  def __set_properties(self):
    # begin wxGlade: MyFrame.__set_properties
    self.SetTitle("Test Radiobuttons")
    self.SetSize((160, 100))
    # end wxGlade

  def __do_layout(self):
    # begin wxGlade: MyFrame.__do_layout
    sizer_1 = wx.BoxSizer(wx.VERTICAL)
    sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_8 = wx.BoxSizer(wx.VERTICAL)
    sizer_7 = wx.BoxSizer(wx.VERTICAL)
    sizer_6 = wx.BoxSizer(wx.VERTICAL)
    sizer_6.Add(self.radio_btn_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
    sizer_2.Add(sizer_6, 1, wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_7.Add(self.radio_btn_2, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
    sizer_2.Add(sizer_7, 1, wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_8.Add(self.radio_btn_3, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
    sizer_2.Add(sizer_8, 1, wx.ALIGN_CENTER_VERTICAL, 0)
    sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_1)
    self.Layout()
    # end wxGlade

# end of class MyFrame


if __name__ == "__main__":
  app = wx.PySimpleApp(0)
  wx.InitAllImageHandlers()
  frame_1 = MyFrame(None, -1, "")
  app.SetTopWindow(frame_1)
  frame_1.Show()
  app.MainLoop()