wxPython - невозможно нажать на кнопку или переместить слайдер

РАБОТАЕТ (Linux Mint, Python 2.7.5, wxPython 2.8.12.1 (gtk2-unicode)), но не с Windows 7. Может кто-то еще с Windows попробовать?

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

import wx

class MainWindow(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs) 

        self.InitUI()

    def InitUI(self):
        self.SetSize((1300, 700))
        self.SetTitle('GUI made by James')

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('#4f5049')
        mainPanel = wx.Panel(self.panel)
        mainPanel.SetBackgroundColour('#ededed')

        sub_vbox = wx.BoxSizer(wx.VERTICAL)
        subPanel_top = wx.Panel(mainPanel)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hierarchy_browser = wx.TextCtrl(subPanel_top, style = wx.TE_MULTILINE)
        hbox.Add(hierarchy_browser, proportion = 1, flag = wx.TOP | wx.BOTTOM | wx.LEFT | wx.EXPAND, border = 10)
        subPanel_right = wx.Panel(mainPanel)
        wx.StaticText(subPanel_right, -1, "This is custom static text", (10, 10), (300, -1), wx.ALIGN_CENTER)
        button = wx.Button(subPanel_right, label = "exit", pos = (500, 100), size = (60, 60)) #can't press for some reason
        slider = wx.Slider(subPanel_right, -1, 50, 1, 100, pos = (320, 10), size = (250, -1), style = wx.SL_AUTOTICKS | wx.SL_LABELS)  # can't slide for some reason
        slider.SetTickFreq(5, 1)

        hbox.Add(subPanel_right, proportion = 1, flag = wx.TOP | wx.BOTTOM | wx.LEFT | wx.EXPAND, border = 10)
        subPanel_top.SetSizer(hbox)

        sub_vbox.Add(subPanel_top, 1, wx.EXPAND)

        subPanel_bottom = wx.Panel(mainPanel)
        text_entry = wx.TextCtrl(subPanel_bottom, style = wx.TE_MULTILINE)
        text_sizer = wx.BoxSizer()  # use sizer to expand TextCtrl
        text_sizer.Add(text_entry, 1, flag = wx.LEFT | wx.RIGHT |  wx.BOTTOM | wx.EXPAND, border = 10)
        subPanel_bottom.SetSizerAndFit(text_sizer)
        sub_vbox.Add(subPanel_bottom, 1, wx.EXPAND)
        mainPanel.SetSizer(sub_vbox)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(mainPanel, 1, wx.EXPAND | wx.ALL, 10)
        self.panel.SetSizer(vbox)

        self.Bind(wx.EVT_BUTTON, self.closebutton, button)
        self.Bind(wx.EVT_CLOSE, self.closewindow)

        self.Centre()
        self.Show(True)

    def closebutton(self, event):
        self.Close(True)

    def closewindow(self, event):
        self.Destroy()

def main():
    ex = wx.App()
    MainWindow(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()

1 ответ

Решение

Ваш subPanel_right не имеет размера, так как вы просто прикрепляете к нему объекты, а не используете sizer... поэтому, когда sizer изменяет размер, его размер равен none, и вы не можете нажать

Одним из решений является установка размера панели

subPanel_right = wx.Panel(subPanel_top,-1,size=(560,300))

Вы можете сделать что-нибудь смешное после и сделать

subPanel_right.SetMinSize(560,300)

заставить его быть такого размера и не изменять его размер (я не знаю, у меня это получалось без этого, но иногда мне приходится это делать)

В общем случае не следует смешивать абсолютные макеты с макетами, управляемыми Sizer... например, одной панели с flexgridbagsizer, вероятно, было бы достаточно... или одну панель с некоторыми хитрыми бокс-макетами

Другие вопросы по тегам