2013-11-28 5 views
0

Я пытаюсь настроить дисплей, чтобы показать игровой и аватар пользователей, добавленных в текстовый файл, это большая часть пути, но я не могу заставить их правильно позиционировать ,WxPython динамически добавил sizers mis-behaving

Быстрый макет того, что я хочу: here.

Вот что я в настоящее время на старте: here

EDIT: Я перешел от использования BoxSizer с использованием GridSizer и что, кажется, исправили проблему положения, они больше не перекрывают друг друга, проблемы переключения все еще присутствует.

Измеритель, содержащий пользователей, не должен перекрываться с входным устройством в верхней части, я не знаю, что вызывает это.

А что происходит, когда он обновляется, чтобы проверить наличие новых пользователей: here

Может быть не так легко увидеть, но на втором изображении самый низкий пользователь перемещается вниз, она становится все дальше и дальше вниз, как программа выполняется каждый раз, когда он перемещается вниз по собственной высоте.

Соответствующий код направления:

  • Создание исходных классификаторов

    self.main_sizer = wx.BoxSizer(wx.VERTICAL) 
    self.widget_sizer = wx.BoxSizer(wx.VERTICAL) 
    #Holds input for gamertags and addition 
    self.input_sizer = wx.BoxSizer(wx.HORIZONTAL) 
    
    #Content to be added immediately. 
    self.gamer_tag_textbox = wx.TextCtrl(self, -1) 
    self.gamer_tag_textbox.SetFocus() 
    self.add_gamer_tag = wx.Button(self, -1, 'Add Friend') 
    #Contains the displayed content 
    self.user_sizer = wx.BoxSizer(wx.VERTICAL) 
    
    #Add objects to sizers 
    self.input_sizer.Add(self.gamer_tag_textbox, 0) 
    self.input_sizer.Add(self.add_gamer_tag, 0) 
    
    #Set up the sizers 
    self.widget_sizer.Add(self.input_sizer, 0) 
    self.widget_sizer.Add(self.user_sizer, 0) 
    self.main_sizer.Add(self.widget_sizer, 0) 
    self.SetSizer(self.main_sizer) 
    
  • Добавление классификаторов, созданных для каждого пользователя к основному user_sizer.

    def display_user_content(self, details): 
        self.user_sizer.Clear(True) 
        #This is different to the original code, it originally used boxsizers in the for each loop. 
        self.single_user_sizer = wx.GridSizer(cols=2) 
        for each in details: 
         #Create sizer to contain user information 
         #Get username 
         username = each[0] 
         #Get location of image file 
         location = each[-1] 
         #Create static text to contain username 
         stat = wx.StaticText(self, -1, 'username') 
         #Load image from location and convert to bitmap. 
         png = wx.Image(location, wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
         #Create bitmap 
         avatar = wx.StaticBitmap(self, -1, png) 
         #Add to sizer 
         self.single_user_sizer.Add(avatar, 1) 
         self.single_user_sizer.Add(stat, 1) 
        #Add each users sizer to main user sizer 
        self.user_sizer.Add(self.single_user_sizer, 1) 
        #Add main user sizer to widget sizer 
        self.widget_sizer.Add(self.user_sizer, 0) 
        self.frame.Fit() 
    

Полный код (минус классы): here

+1

Это очень трудно понять код, особенно когда я не могу запустить его. Конечно, кто-то может увидеть проблему из рук. Но обычно рекомендуется создать минимальный рабочий пример, который демонстрирует проблему (и только проблему). Для проблем с макетами было бы неплохо, если бы вы могли создать пример только для макета с цветными панелями или что-то (похожее на ваш «быстрый макет»). Тогда было бы намного легче помочь. Также см. Wiki.wxpython.org/MakingSampleApps – Fenikso

+0

BTW: Кажется, что вы ищете sizer, который обрабатывает сетку с строками/столбцами разных размеров. Подумайте об использовании 'wx.GridBagSizer'. – Fenikso

ответ

0

В конце функции display_user_content я добавлял user_sizer к widget_sizer каждый раз, это было ненужно и вызывает удвоение числа результатов, я удалил эту строку и мой код теперь работает.

Фиксированный код:

def display_user_content(self, details): 
    self.user_sizer.Clear(True) 
    self.single_user_sizer = wx.GridSizer(cols=2, hgap=5, vgap=5) 
    for each in details: 
     #Get username 
     self.username_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     username = each[0] 
     #Get location of image file 
     location = each[-1] 
     #Create static text to contain username 
     stat = wx.StaticText(self, -1, 'username') 
     #Load image from location and convert to bitmap. 
     png = wx.Image(location, wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     #Create bitmap 
     avatar = wx.StaticBitmap(self, -1, png) 
     #Add to sizer 
     self.single_user_sizer.Add(avatar, 0) 
     self.username_sizer.Add(stat, 0) 
     self.single_user_sizer.Add(self.username_sizer, 0) 
    #Add each users sizer to main user sizer 
    self.user_sizer.Add(self.single_user_sizer, 0) 
    #Add main user sizer to widget sizer 
    #self.widget_sizer.Add(self.user_sizer, 0) 
    self.Fit() 
0

Может быть, это похоже на то, что вы хотели бы достичь?

import wx 

NUMBER = 3 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.windowSizer = wx.BoxSizer() 
     self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) 

     self.sizer = wx.GridBagSizer(vgap=5, hgap=5) 

     self.text = wx.TextCtrl(self.panel, size=(0, 0)) 
     self.button = wx.Button(self.panel) 

     self.sizer.Add(self.text, (0, 0), flag=wx.EXPAND) 
     self.sizer.Add(self.button, (0, 1)) 

     self.icons = [] 
     self.stats = [] 
     for i in range(NUMBER): 
      icon = wx.Panel(self.panel, size=(50, 50)) 
      icon.SetBackgroundColour(wx.RED) 
      stat = wx.Panel(self.panel, size=(200, -1)) 
      stat.SetBackgroundColour(wx.BLUE) 
      self.sizer.Add(icon, (i+1, 0)) 
      self.sizer.Add(stat, (i+1, 1), flag=wx.EXPAND) 
      self.icons.append(icon) 
      self.stats.append(stat) 

     self.sizer.AddGrowableCol(1) 

     self.border = wx.BoxSizer() 
     self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) 

     self.panel.SetSizerAndFit(self.border) 
     self.SetSizerAndFit(self.windowSizer) 
     self.Show() 

app = wx.App(False) 
win1 = MainWindow(None) 
app.MainLoop() 

Или, может быть, больше нравится?

import wx 

NUMBER = 3 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.windowSizer = wx.BoxSizer() 
     self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) 

     self.sizer = wx.GridBagSizer(vgap=5, hgap=5) 
     self.toolbar_sizer = wx.BoxSizer() 

     self.text = wx.TextCtrl(self.panel) 
     self.button = wx.Button(self.panel) 

     self.toolbar_sizer.Add(self.text, 0, flag=wx.CENTER) 
     self.toolbar_sizer.Add(self.button, 0) 
     self.sizer.Add(self.toolbar_sizer, (0, 0), span=(1, 2), flag=wx.EXPAND) 

     self.icons = [] 
     self.stats = [] 
     for i in range(NUMBER): 
      icon = wx.Panel(self.panel, size=(50, 50)) 
      icon.SetBackgroundColour(wx.RED) 
      stat = wx.Panel(self.panel, size=(200, -1)) 
      stat.SetBackgroundColour(wx.BLUE) 
      self.sizer.Add(icon, (i+1, 0)) 
      self.sizer.Add(stat, (i+1, 1), flag=wx.EXPAND) 
      self.icons.append(icon) 
      self.stats.append(stat) 

     self.sizer.AddGrowableCol(1) 

     self.border = wx.BoxSizer() 
     self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) 

     self.panel.SetSizerAndFit(self.border) 
     self.SetSizerAndFit(self.windowSizer) 
     self.Show() 

app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
Смежные вопросы