2014-07-04 2 views
1

Я создаю многоколоночные списки, все равны по длине, а также генерируют количество переключателей, равное длине списка. У меня есть пара вопросов:Проблема с отображением и выбором переключателя радио в wxPython

1] Проблема с отображением: на следующем рисунке я получаю радиокнопки. enter image description here

Но когда я прокручиваю вниз, это то, что происходит. enter image description here

Ниже приведен фрагмент моего кода для его генерации. Помогите мне исправить эту проблему, чтобы получить полный список переключателей, отображаемых правильно.

w = 0 
for i in range(1,len(lut_code)): 
    w += 30 
    rb_G = wx.RadioButton(scroll1, -1, "G", (500,w), style=wx.RB_GROUP) 
    rb_F = wx.RadioButton(scroll1, -1, "F", (540,w)) 
    rb_P = wx.RadioButton(scroll1, -1, "P", (580,w)) 

2] Выбор кнопки радио: Когда я хочу, чтобы выбрать кнопку одного радио из ряда, полный ряд выбран вместо этого и становится синим цветом, как в следующем рис. enter image description here

Это из-за моего использования wx.ListCtrl для отображения этих столбцов? Каким будет исправить или альтернативный метод, чтобы выбрать только переключатель выбора, а не выбирать целую строку?

+0

Когда переключатель переключается в синий цвет, вы можете выбрать любой из параметров? – user2963623

+0

Нет, он просто превращает полный ряд в синюю полосу. – Ibe

+0

Как вы ввели переключатели внутри list_ctrl? – user2963623

ответ

1

Пришло время понять это. Я думаю, вы на самом деле рисуете радиокнопки на кадре, указав позицию! Очевидно, что это не будет работать в этом случае, потому что ваш listCtrl выходит на передний план, когда вы пытаетесь выбрать переключатель.

Если вы заметили, что переключатели неправильно выровнены в соответствии с элементами списка. Разрыв между кнопками больше, чем разрыв между строками списка.

Проблема с использованием list_ctrl заключается в том, что вы не можете помещать в них виджеты, такие как переключатели.

Я предлагаю вам использовать что-то вроде wx.ScrolledWindow для этого. Поместите каждую строку в sizer и поместите эти sizers по вертикали.

UPDATE:

import wx 

class Frame (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = u"Test", pos = wx.DefaultPosition, size = wx.Size(-1,-1), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 

     sizer0 = wx.BoxSizer(wx.VERTICAL) 

     self.scrolledWindow = wx.ScrolledWindow(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.HSCROLL|wx.VSCROLL) 
     self.scrolledWindow.SetScrollRate(5, 5) 
     grid_sizer = wx.GridSizer(0, 8, 0, 0) 

     self.head1 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"Code", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head1.Wrap(-1) 
     grid_sizer.Add(self.head1, 0, wx.ALL, 5) 

     self.head2 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"Classification", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head2.Wrap(-1) 
     grid_sizer.Add(self.head2, 0, wx.ALL, 5) 

     self.head3 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"A", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head3.Wrap(-1) 
     grid_sizer.Add(self.head3, 0, wx.ALL, 5) 

     self.head4 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"B", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head4.Wrap(-1) 
     grid_sizer.Add(self.head4, 0, wx.ALL, 5) 

     self.head5 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"C", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head5.Wrap(-1) 
     grid_sizer.Add(self.head5, 0, wx.ALL, 5) 

     self.head6 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"D", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head6.Wrap(-1) 
     grid_sizer.Add(self.head6, 0, wx.ALL, 5) 

     self.head7 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"Cond.", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head7.Wrap(-1) 
     grid_sizer.Add(self.head7, 0, wx.ALL, 5) 

     self.head8 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"Update", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.head8.Wrap(-1) 
     grid_sizer.Add(self.head8, 0, wx.ALL, 5) 

     self.column11 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"86", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column11.Wrap(-1) 
     grid_sizer.Add(self.column11, 0, wx.ALL, 5) 

     self.column12 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"Urban", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column12.Wrap(-1) 
     grid_sizer.Add(self.column12, 0, wx.ALL, 5) 

     self.column13 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"68", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column13.Wrap(-1) 
     grid_sizer.Add(self.column13, 0, wx.ALL, 5) 

     self.column14 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"80", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column14.Wrap(-1) 
     grid_sizer.Add(self.column14, 0, wx.ALL, 5) 

     self.column15 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"86", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column15.Wrap(-1) 
     grid_sizer.Add(self.column15, 0, wx.ALL, 5) 

     self.column16 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, u"89", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column16.Wrap(-1) 
     grid_sizer.Add(self.column16, 0, wx.ALL, 5) 

     self.column17 = wx.StaticText(self.scrolledWindow, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0) 
     self.column17.Wrap(-1) 
     grid_sizer.Add(self.column17, 0, wx.ALL, 5) 

     radio1Choices = [ u"G", u"P", u"F" ] 
     self.radio1 = wx.RadioBox(self.scrolledWindow, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, radio1Choices, 3, wx.RA_SPECIFY_COLS) 
     self.radio1.SetSelection(0) 
     grid_sizer.Add(self.radio1, 0, wx.ALL, 5) 


     self.scrolledWindow.SetSizer(grid_sizer) 
     self.scrolledWindow.Layout() 
     grid_sizer.Fit(self.scrolledWindow) 
     sizer0.Add(self.scrolledWindow, 1, wx.EXPAND |wx.ALL, 5) 

     # Bind the radio box select event to a function 
     self.radio1.Bind(wx.EVT_RADIOBOX, self.on_selected) 


     self.SetSizer(sizer0) 
     self.Layout() 
     self.Maximize() 
     self.Centre(wx.BOTH) 
     self.Show() 

    def on_selected(self, event): 
     # Depending upon the option selected the values of A,B,C,D are changed 
     if self.radio1.GetStringSelection() == 'P': 
      self.column13.SetLabel('25') 
      self.column14.SetLabel('27') 
      self.column15.SetLabel('34') 
      self.column16.SetLabel('12') 
     elif self.radio1.GetStringSelection() == 'F': 
      self.column13.SetLabel('56') 
      self.column14.SetLabel('70') 
      self.column15.SetLabel('49') 
      self.column16.SetLabel('54') 
     else: 
      self.column13.SetLabel('78') 
      self.column14.SetLabel('83') 
      self.column15.SetLabel('69') 
      self.column16.SetLabel('100') 


if __name__ == "__main__": 
     app = wx.App() 
     Frame(None) 
     app.MainLoop() 

Я написал этот пример кода, чтобы показать вам, как вы можете это сделать. Это немного грубо, но я надеюсь, что вы получите картину.

Вы также можете проверить ответ в этом сообщении: Adding a button to every row in ListCtrl WxPython. Это может быть лучший выбор.

+0

Я не совсем понимаю ваше объяснение 'wx.ScrolledWindow'. Есть ли какой-нибудь пример, на который вы можете указать мне? – Ibe

+0

Ваш ответ полезен, но я должен обновлять столбцы «A», «B», «C» и «D» всякий раз, когда я меняю выбор с «G» на «F» или «P» для всех типов классификации. Я думаю, что я не могу читать эти столбцы как статический текст, потому что он должен быть динамическим. Вы предлагаете какой-либо способ сделать выбор динамика радиоблока, чтобы показать изменение значений в этих четырех столбцах? – Ibe

+0

Вы можете связать событие выбора radio_button с функцией, которая проверяет, какая опция выбрана, и соответственно обновляет столбцы. – user2963623

Смежные вопросы