在wxpython中将按钮放置在列表框下方?

1 投票
1 回答
600 浏览
提问于 2025-04-17 05:54

我想在列表框下面放两个按钮,但我尝试的所有方法都让界面变形或者出现问题。希望有人能帮帮我。

我想把这两个按钮放在列表框的下方,并且它们的位置应该根据窗口的大小自动调整(这样按钮不会消失)。简单来说,就是当你调整应用窗口的大小时,按钮的位置也应该跟着变化。

这是我目前的代码

things_inlistbox=[]
things2_listbox=[]
things3listbox=[]
things4listbox=[]
import wx
def areachange(self,pg):
    print pg
    if pg=="Things":
        self.Things_area.Show()
    else:
        self.Things_area.Hide()

class things1tab(wx.Panel):
    def newAddImage(self,parent):
        things2_listbox.append('hi');
        self.listBox.Set(things2_listbox)
        self.listBox.SetSelection(len(things2_listbox)-1)
    def reName(self,parent):
        sel = self.listBox.GetSelection()
        text = self.listBox.GetString(sel)
        renamed = wx.GetTextFromUser('Rename item', 'Rename dialog', text)
        if renamed != '':
            things2_listbox.pop(sel)
            things2_listbox.insert(sel,renamed)
            self.listBox.Set(things2_listbox)
            self.listBox.SetSelection(sel)
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.listBox = wx.ListBox(self, size=(200, -1), choices=things2_listbox, style=wx.LB_SINGLE)
        self.sizer = wx.BoxSizer()
        self.sizerMain = wx.BoxSizer()
        self.listBox.Bind(wx.EVT_LISTBOX_DCLICK, self.reName)

        self.sizer.Add(self.listBox, proportion=0, flag=wx.TOP | wx.EXPAND | wx.LEFT, border=5)
        self.sizerMain.Add(self.sizer, proportion=0, flag=wx.BOTTOM | wx.EXPAND, border=70)
        self.SetSizer(self.sizerMain)
class imageArea(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        wx.StaticBox(self, -1, 'Personal Info', (400, 5), size=(240, 170))
        self.quote = wx.StaticText(self, label="Your quote :", pos=(20, 30), size=(200, -1))
        self.Show()

        self.SetSizer(self.sizerMain)
class things2tab(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageTwo object", (40,40))

class things3tab(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageThree object", (60,60))

class things4tab(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        t = wx.StaticText(self, -1, "This is a PageThree object", (400,60))

class MyNotebook(wx.Notebook):
    def __init__(self, *args, **kwargs):
        wx.Notebook.__init__(self, *args, **kwargs)

class MyPanel(wx.Panel):
    def OnPageChanged(self, event):
        new = event.GetSelection()
        areachange(self,self.notebook.GetPageText(new))
        event.Skip()

    def OnPageChanging(self, event):
        event.Skip()
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        self.notebook = MyNotebook(self, size=(225, -1))
#        self.button = wx.Button(self, label="Something else here? Maybe!")
        tab_Things = things1tab(self.notebook)
        tab_Things2 = things2tab(self.notebook)
        tab_Things3 = things3tab(self.notebook)
        tab_Things4 = things4tab(self.notebook)

        # add the pages to the notebook with the label to show on the tab
        self.notebook.AddPage(tab_Things, "Things",select=True)
        self.notebook.AddPage(tab_Things2, "Things2")
        self.notebook.AddPage(tab_Things3, "Things3")
        self.notebook.AddPage(tab_Things4, "Things4")
        self.Things_area=wx.StaticText(self, -1, "This is a PageOne object", (300,240))
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.notebook, proportion=0, flag=wx.EXPAND)
#        self.sizer.Add(self.button, proportion=0)
        self.SetSizer(self.sizer)
        self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
        self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging)
        areachange(self,self.notebook.GetPageText(0))        


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

        self.Show()


app = wx.App(False)
win = MainWindow(None, size=(600, 400))
app.MainLoop()

我不太确定该怎么做,如果有人能帮我,我会非常感激。如果这很简单,请多多包涵,不过我已经在这上面卡了好几天了。

1 个回答

1

我不太确定这是不是你想要的,不过你可以试着把你的“things1tab”代码换成这个,看看能不能用:

class things1tab(wx.Panel):
    def newAddImage(self,parent):
        things2_listbox.append('hi');
        self.listBox.Set(things2_listbox)
        self.listBox.SetSelection(len(things2_listbox)-1)
    def reName(self,parent):
        sel = self.listBox.GetSelection()
        text = self.listBox.GetString(sel)
        renamed = wx.GetTextFromUser('Rename item', 'Rename dialog', text)
        if renamed != '':
            things2_listbox.pop(sel)
            things2_listbox.insert(sel,renamed)
            self.listBox.Set(things2_listbox)
            self.listBox.SetSelection(sel)
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.listBox = wx.ListBox(self, size=(200, -1), choices=things2_listbox, style=wx.LB_SINGLE)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizerMain = wx.BoxSizer()
        self.listBox.Bind(wx.EVT_LISTBOX_DCLICK, self.reName)
        btn = wx.Button(self, label="Test")
        btnTwo = wx.Button(self, label="Test 2")

        self.sizer.Add(self.listBox, proportion=1, flag=wx.TOP | wx.EXPAND | wx.LEFT, border=5)
        btnSizer.Add(btn, 0, wx.ALL, 5)
        btnSizer.Add(btnTwo, 0, wx.ALL, 5)
        self.sizer.Add(btnSizer)
        self.sizerMain.Add(self.sizer, proportion=0, flag=wx.BOTTOM | wx.EXPAND, border=70)
        self.SetSizer(self.sizerMain)

我做的就是创建了一个按钮的布局,然后在里面加了两个按钮,把它放进你的“self.sizer”里。我还把下面这个比例从零改成了一。

self.sizer.Add(self.listBox, proportion=1, flag=wx.TOP | wx.EXPAND | wx.LEFT, border=5)

希望这样能帮你更进一步。

撰写回答