Отключение визуального акцента метки переключателя в Python wx?

Используя приведенный ниже код (сгенерированный с помощью wxglade, протестированный с использованием wxPython 2.8.11.0, Python 2.7.1+, Ubuntu 11.04), я получаю следующий результат:

test.png

Даже если я удалил тексты с меток во время создания экземпляра, метка все еще отображается при нажатии кнопок! Как я могу удалить этот эффект; можно ли отключить только метку, оставив радиокнопки в целом активными? Я просто не хочу, чтобы что-либо еще отображалось кругом радиокнопок, независимо от того, выбрано оно или нет.

РЕДАКТИРОВАТЬ: только что обнаружил, что маленький прямоугольник, отображаемый кругом переключателя, по-видимому, предназначен для фокусировки; так что вопрос может быть: можно ли отключить индикацию фокусировки для переключателей, сохранив при этом все остальные функции?

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()

person sdaau    schedule 06.01.2015    source источник


Ответы (1)


Хорошо, я думаю, что понял это, как фокус/визуальный акцент, так и центрирование:

test.png

  • Для фокусировки я настроил переключатели так, чтобы они привязывались к EVT_SET_FOCUS; затем я создал - но не разместил - пустую панель; затем, как только обработчик фокуса попадает, я устанавливаю фокус на неразмещенную панель; и это, кажется, удаляет визуальный фокус
  • Для центрирования на самом деле важно, чтобы была такая структура:

wxglade.png

... то есть: сначала у вас есть трехсторонний горизонтальный размерчик; но внутри него дочерние элементы первого уровня должны быть (односторонними) вертикальными размерами - и ни один из них не может быть установлен в 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()
person sdaau    schedule 06.01.2015