Как связать несколько wx.Dialogs в wxPython

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

Я сделал игровой экран со всеми причудливыми вещами (работает соло). Я сделал входные экраны. Но я не могу их связать.

Как начать игру, чтобы открыть диалоговое окно, а затем закрыть его, а затем открыть игру?

Я попробовал следующее, но он не откроет мой холст:

# makes a game by showing 2 dialogs # after dialogs have been answered, starts the game by drawing the canvas. # imports import wx import Speelveld3 # globals SCRWIDTH = 950 SCRHEIGHT = 700 # dialogbox class class MyDialog1(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent) self.username = wx.TextCtrl(self) self.okButton = wx.Button(self, wx.ID_OK, "OK") class MyDialog2(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent) self.canvasWidth = wx.TextCtrl(self) self.okButton = wx.Button(self, wx.ID_OK, "OK") # main class class Game(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, title='My game', size=(SCRWIDTH, SCRHEIGHT)) self.username = "" self.canvasWidth = 10 # hide the frame for now self.Hide() def OnInit(self): #Make your dialogs dlg1 = MyDialog1(self) #if the user pressed "OK" (ie NOT "Cancel" or any other button you might add) if dlg1.ShowModal() == wx.ID_OK: #get the username from the dialog self.username = dlg1.username.GetValue() #clean up the dialog (AFTER you get the username) dlg1.Destroy() dlg2 = MyDialog2(self) #if the user pressed "OK" (ie NOT "Cancel" or any other button you might add) if dlg2.ShowModal() == wx.ID_OK: #get the username from the dialog self.canvasWidth = dlg2.canvasWidth.GetValue() #clean up the dialog (AFTER you get the username) dlg2.Destroy() # Now that you have your settings, Make the gameboard # THIS PART IS STILL BROKEN! # I can paste the whole board class (structure of it is taken from the tetris tutorial) # but that seems a bit much tbh... self.gameBoard = Board.Board(self) self.gameBoard = SetFocus() self.gameBoard.start() self.Centre() self.Show(True) #show the frame if __name__ == '__main__': # how can I start the game here? app = wx.App() frame = Game() board = Speelveld3.Speelveld(frame) board.start() frame.Show() app.MainLoop() 

2 Solutions collect form web for “Как связать несколько wx.Dialogs в wxPython”

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

Во-первых, если вы хотите вернуть информацию из диалога, самым простым способом является определение настраиваемого диалога . Определите новый класс, который наследуется от wx.Dialog а затем настройте его так же, как и обычную панель или фрейм. Мне кажется, что вам понадобятся два из них. Они будут выглядеть примерно так:

 class MyDialog1(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent) self.username = wx.TextCtrl(self) #this is where users will enter their username self.okButton = wx.Button(self, wx.ID_OK, "OK") #Note that I'm using wx.ID_OK. This is important 

Теперь, для логики, которую вы хотите. Практически каждый объект в wxPython, который вы на самом деле видите, имеет функции Show() и Hide() ( здесь API). Вы не хотите показывать свой кадр, пока ПОСЛЕ завершения диалогов, поэтому в своем __init__() вызовите Hide() . Я также инициализирую переменную, username , где я буду хранить данные из своего диалога.

 class Game(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, size=(SCRWIDTH, SCRHEIGHT)) self.username = "" self.Hide() #don't show the frame just yet #self.Hide() is the exact same as self.Show(False) 

Теперь для ваших диалогов. Как предложил Майк Дрисколл, вы вызываете свои диалоги перед созданием своего холста. wx.Dialogs запускаются с использованием ShowModal() . Установив идентификатор self.okButton на константу wx.ID_OK , wxPython распознает, что диалог должен быть закрыт после нажатия кнопки. Вы также должны знать wx.ID_CANCEL .

 def OnInit(self): #Make your dialogs dlg1 = MyDialog1(self) if dlg1.ShowModal() == wx.ID_OK: #if the user pressed "OK" (ie NOT "Cancel" or any other button you might add) self.username = dlg1.username.GetValue() #get the username from the dialog dlg1.Destroy() #clean up the dialog (AFTER you get the username) #do this again for your second dialog #Now that you have your settings, Make the gameboard self.gameBoard = Board.Board(self) self.gameBoard = SetFocus() self.gameBoard.start() self.Centre() self.Show(True) #show the frame 

В вашем OnInit вам просто нужно позвонить в ваши диалоги и показать их по умолчанию до того, как вы создадите экземпляр своего Совета. Тогда он должен работать правильно.

EDIT (6-28-12): Вот код:

 import wx ######################################################################## class MyDlg(wx.Dialog): """""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" wx.Dialog.__init__(self, None, title="I'm a dialog!") lbl = wx.StaticText(self, label="Hi from the panel's init!") btn = wx.Button(self, id=wx.ID_OK, label="Close me") sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(lbl, 0, wx.ALL, 5) sizer.Add(btn, 0, wx.ALL, 5) self.SetSizer(sizer) ######################################################################## class MyPanel(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) # show a custom dialog dlg = MyDlg() dlg.ShowModal() dlg.Destroy() self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, evt): pdc = wx.PaintDC(self) try: dc = wx.GCDC(pdc) except: dc = pdc rect = wx.Rect(0,0, 100, 100) for RGB, pos in [((178, 34, 34), ( 50, 90)), (( 35, 142, 35), (110, 150)), (( 0, 0, 139), (170, 90)) ]: r, g, b = RGB penclr = wx.Colour(r, g, b, wx.ALPHA_OPAQUE) brushclr = wx.Colour(r, g, b, 128) # half transparent dc.SetPen(wx.Pen(penclr)) dc.SetBrush(wx.Brush(brushclr)) rect.SetPosition(pos) dc.DrawRoundedRectangleRect(rect, 8) ######################################################################## class MyFrame(wx.Frame): """""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Example frame") # show a MessageDialog style = wx.OK|wx.ICON_INFORMATION dlg = wx.MessageDialog(parent=None, message="Hello from the frame's init", caption="Information", style=style) dlg.ShowModal() dlg.Destroy() # create panel panel = MyPanel(self) if __name__ == "__main__": app = wx.App(False) frame = MyFrame() frame.Show() app.MainLoop() 
Python - лучший язык программирования в мире.