使用下面发布的代码(使用wxglade
生成,使用wxPython 2.8.11.0,Python 2.7.1 +,Ubuntu 11.04测试),我得到了这个输出:
即使我在实例化过程中从标签中删除了文本,按下按钮时标签仍然仍然呈现!我怎样才能消除这种影响;是否可以仅禁用标签,同时保持单选按钮整体活动?我只是不想要无线电按钮圆圈所呈现的任何其他东西,无论它是否被选中。
编辑:刚刚发现由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()
答案 0 :(得分:0)
好吧,我认为我得到了这个,包括聚焦/视觉强调和中心:
EVT_SET_FOCUS
;然后,我已经实例化 - 但没有放置 - 一个空的面板;然后,一旦焦点处理程序命中,我将焦点设置为未放置的面板;这似乎消除了视觉焦点
......那就是:你首先有一个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()