2014-03-20 3 views
0

В этом бите кода wxPython есть проблема, StaticText заставляет все остальное исчезать.wxPython StaticText Issue in my Code

Примечание: Это мой первый опыт использования wxPython, и я очень новичок в программировании в целом, поэтому, пожалуйста, попробуйте дать ясное объяснение. Благодаря!

import wx 

APP_EXIT = 1 
pos1 = (150, 200) 

class scoutingSet(wx.Frame): 

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

     self.InitUI() 

    def InitUI(self): 

     ############################################################ 
     # MENUBARS AND MENUITEMS 
     menuBar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     fileMenu2 = wx.Menu() 

     openSheet = wx.MenuItem(fileMenu, wx.ID_ANY, 'Open') 
     openSheet.SetBitmap(wx.Bitmap('open.png')) 
     fileMenu.AppendItem(openSheet) 
     fileMenu.AppendSeparator() 

     saveSheet = wx.MenuItem(fileMenu, wx.ID_ANY, 'Save') 
     saveSheet.SetBitmap(wx.Bitmap('save.png')) 
     fileMenu.AppendItem(saveSheet) 
     fileMenu.AppendSeparator() 

     quitSheet = wx.MenuItem(fileMenu, APP_EXIT, 'Quit') 
     quitSheet.SetBitmap(wx.Bitmap('close.png')) 
     fileMenu.AppendItem(quitSheet) 
     self.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT) 

     fileMenu2.Append(100, '&About') 
     self.Bind(wx.EVT_MENU, self.aboutBox, id=100) 

     menuBar.Append(fileMenu, 'File') 
     menuBar.Append(fileMenu2, 'Information') 
     self.SetMenuBar(menuBar) 

     ############################################################ 
     # BUTTONS AND CONTROL 

     panel = wx.Panel(self) 
     closebutton = wx.Button(panel, label = 'Close\nClose', pos = (20, 30)) 

     closebutton.Bind(wx.EVT_BUTTON, self.OnQuit) 

     ############################################################ 
     # STATIC TEXTS 


     ############################################################ 
     # TEXT CONTROL BOXES 


     wx.TextCtrl(panel, pos = pos1, size = (50, 50)) 
     wx.TextCtrl(panel, pos = (300, 400), size = (50, 50)) 

     ############################################################ 
     # SETTINGS 

     self.stuff(self) 

     self.Maximize() 
     self.SetTitle('Scouting Sheet') 
     self.Centre() 
     self.Show(True) 

     ############################################################ 

     # Quitting 

    def OnQuit(self, e): 
     self.Close() 

    # Info in 

    def aboutBox(self, e): 
     desc = """This is the SOTAbots 2014 scouting sheet for the FRC 2014 game Aerial Assist""" 

     infoInAbout = wx.AboutDialogInfo() 
     infoInAbout.SetIcon(wx.Icon('scouting.png', wx.BITMAP_TYPE_PNG)) 
     infoInAbout.SetName('Scouting Sheet') 
     infoInAbout.SetVersion('1.0') 
     infoInAbout.SetDescription(desc) 
     infoInAbout.AddDeveloper('Franklin Lyon\nLucas Grillos') 
     wx.AboutBox(infoInAbout) 

    def stuff(self, e): 
     textpnl = wx.StaticText(self,-1 , label='Watermark', pos=(20, 30)) 
     textpnl.SetForegroundColour('white') 
     textpnl.SetBackgroundColour('blue') 

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

if __name__ == '__main__': 
    main() 

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

Заранее спасибо.

ответ

0

Я думаю, что wx.StaticText помещается на себя (wx.Frame), а не на панель, хотя wx.TextCtrl находятся на панели. Что произойдет, если вы поместите wx.StaticText на панель?

Кроме того, для управления макетом вам нужен Sizer (например, wx.BoxSizer). Вы можете найти учебник о wx.BoxSizer по адресу http://zetcode.com/wxpython/layout/. В initUI я сделаю что-то вроде:

txtctrl1 = wx.TextCtrl(panel, pos = pos1, size = (50, 50)) 
txtctrl2 = wx.TextCtrl(panel, pos = (300, 400), size = (50, 50)) 
textpnl = wx.StaticText(panel,-1 , label='Watermark', pos=(20, 30)) 

vbox = wx.BoxSizer(wx.VERTICAL) 
vbox.add(txtctrl1, 1, wx.EXPAND | wx.ALL, 5) 
vbox.add(txtctrl2, 1, wx.EXPAND | wx.ALL, 5) 
vbox.add(textpnl , 1, wx.EXPAND | wx.ALL, 5) 
vbox.add(closebutton, 0, wx.EXPAND | wx.ALL, 5) 

panel.SetSizer(vbox) 

Надеюсь, это поможет.

+0

Как бы добавить wx.StaticText к панели? – LucasGrillos

+0

К сожалению, извини, понял. Я должен был бы более внимательно прочитать, что вы сказали. Большое спасибо за помощь! – LucasGrillos

+0

Добро пожаловать. Когда на кадре находится только один виджет, wxpython автоматически обертывает его с помощью sizer и подгоняет его к кадру. Но если их несколько, макет должен вручную обрабатываться пользователем с помощью sizer. Думаю, вот что случилось. Можете ли вы также принять мой ответ? – otterb

0

Вы не правильно размещены компоненты GUI. Я рекомендую вам использовать sizers для правильной компоновки. BoxSizer просты в игре. Вот хороший учебник по Layout management.

Ваш код будет работать, если вы указали размер panel. Используйте эту строку panel = wx.Panel(self, -1, size=(800,800)), теперь вы увидите все свои компоненты! Я также изменил положение вашего статического текста, потому что он был перекрыт кнопкой.

Обратите внимание, что в вашем коде следует избегать использования таких имен, как panel. Вместо того, чтобы использовать что-то вроде myPanel или panelA т.д.

Рабочий код: Испытано на Windows 8, WxPython v3.0

import wx 

APP_EXIT = 1 
pos1 = (150, 200) 

class scoutingSet(wx.Frame): 

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

     self.InitUI() 

    def InitUI(self): 

     ############################################################ 
     # MENUBARS AND MENUITEMS 
     menuBar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     fileMenu2 = wx.Menu() 

     openSheet = wx.MenuItem(fileMenu, wx.ID_ANY, 'Open') 
     openSheet.SetBitmap(wx.Bitmap('open.png')) 
     fileMenu.AppendItem(openSheet) 
     fileMenu.AppendSeparator() 

     saveSheet = wx.MenuItem(fileMenu, wx.ID_ANY, 'Save') 
     saveSheet.SetBitmap(wx.Bitmap('save.png')) 
     fileMenu.AppendItem(saveSheet) 
     fileMenu.AppendSeparator() 

     quitSheet = wx.MenuItem(fileMenu, APP_EXIT, 'Quit') 
     quitSheet.SetBitmap(wx.Bitmap('close.png')) 
     fileMenu.AppendItem(quitSheet) 
     self.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT) 

     fileMenu2.Append(100, '&About') 
     self.Bind(wx.EVT_MENU, self.aboutBox, id=100) 

     menuBar.Append(fileMenu, 'File') 
     menuBar.Append(fileMenu2, 'Information') 
     self.SetMenuBar(menuBar) 

     ############################################################ 
     # BUTTONS AND CONTROL 

     panel = wx.Panel(self, -1, size=(800,800)) 
     closebutton = wx.Button(panel, label = 'Close\nClose', pos = (20, 30)) 

     closebutton.Bind(wx.EVT_BUTTON, self.OnQuit) 

     ############################################################ 
     # STATIC TEXTS 


     ############################################################ 
     # TEXT CONTROL BOXES 


     wx.TextCtrl(panel, pos = pos1, size = (50, 50)) 
     wx.TextCtrl(panel, pos = (300, 400), size = (50, 50)) 

     ############################################################ 
     # SETTINGS 

     self.stuff(self) 

     self.Maximize() 
     self.SetTitle('Scouting Sheet') 
     self.Centre() 
     self.Show(True) 

     ############################################################ 

     # Quitting 

    def OnQuit(self, e): 
     self.Close() 

    # Info in 

    def aboutBox(self, e): 
     desc = """This is the SOTAbots 2014 scouting sheet for the FRC 2014 game Aerial Assist""" 

     infoInAbout = wx.AboutDialogInfo() 
     infoInAbout.SetIcon(wx.Icon('scouting.png', wx.BITMAP_TYPE_PNG)) 
     infoInAbout.SetName('Scouting Sheet') 
     infoInAbout.SetVersion('1.0') 
     infoInAbout.SetDescription(desc) 
     infoInAbout.AddDeveloper('Franklin Lyon\nLucas Grillos') 
     wx.AboutBox(infoInAbout) 

    def stuff(self, e): 
     textpnl = wx.StaticText(self,-1 , label='Watermark', pos=(100, 100)) 
     textpnl.SetForegroundColour('white') 
     textpnl.SetBackgroundColour('blue') 

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

if __name__ == '__main__': 
    main() 

Я надеюсь, что это было полезно.