2015-01-06 4 views
0

이 (wxPython을 2.8.11.0, 파이썬 2.7.1+, 우분투 11.04를 사용하여 테스트, wxglade 생성),이 출력을 얻을 인스턴스화 중 레이블에서 은 여전히 ​​이며 버튼을 누르면 렌더링됩니다. 그 효과를 어떻게 제거 할 수 있습니까? 라디오 버튼을 전체적으로 활성 상태로 유지하면서 레이블 만 비활성화 할 수 있습니까? 라디오 버튼이 선택되었는지 여부에 관계없이 radiobuttons circle에서 렌더링 한 다른 것은 원하지 않습니다.파이썬 wx에서 라디오 버튼 레이블의 시각적 강조 기능을 비활성화 하시겠습니까? 나는 텍스트를 제거하더라도</p> <p><img src="https://i.stack.imgur.com/sRBH2.png" alt="test.png"></p> <p>: 아래 게시 된 코드를 사용하여

EDIT : 라디오 버튼 원에 의해 렌더링 된 작은 사각형이 초점을 맞추기위한 것임을 발견했습니다. 질문은 다음과 같을 수 있습니다 : 다른 모든 기능을 유지하면서 라디오 버튼의 초점 표시를 비활성화 할 수 있습니까?

EDIT2 : 사이드 질문 : 버튼의 원을 항상 스페이서의 가운데에 가운데에 배치하려면 어떻게해야합니까?

#!/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

가 좋아, 내가이 거 같아요, 모두 초점/영상 강조 : 분명히, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL

코드를 (수평 그들은 여전히 ​​왼쪽 정렬 것 같다, 창 크기를 조정하려고) 작동하지 않습니다 및 센터링 : 초점 들어

test.png

  • , 나는 EVT_SET_FOCUS에 바인딩하는 라디오 버튼을 설정; 그런 다음, 빈 패널 (empty panel)을 인스턴스화했습니다. 포커스 처리기가 마자 마자, 나는 배치되지 않은 패널에 초점을 맞 춥니 다. 이것은 센터링을 위해 시각적 포커스
  • 을 제거하는 것, 그것은 이런 구조가 있다는 사실은 중요하다 :

wxglade.png

가 ... 즉 : 먼저 3가 양방향 수평 크기 조절 장치; 하지만 그 안에, 그것의 첫 번째 수준의 어린이 (1 방향) 수직 sizer해야합니다 - 그리고 없음 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() 
:

다음은 현재 작업 코드