WxPython动态添加了sizer错误行为

2024-06-07 21:55:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试设置一个显示,以显示添加到文本文件中的用户的玩家代号和头像,大多数情况下都是这样,但我无法让他们正确定位。在

一个我想要的快速模型:here。在

以下是我当前在开始时的内容:here

编辑:我已经从使用BoxSizer切换到使用GridSizer,这似乎解决了位置问题,它们不再重叠,但是移位问题仍然存在。在

包含用户的sizer不应该与顶部的输入sizer重叠,我不知道是什么原因造成的。

当它更新以检查新用户时会发生什么: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)
    
  • 将为每个用户创建的sizer添加到主用户\u 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


Tags: to用户selfaddinputheremaintag
2条回答

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

也许这和你想要达到的目标相似?在

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

或者更像这样?在

^{pr2}$

相关问题 更多 >

    热门问题