Wx рамка закрывается автоматически - PullRequest
0 голосов
/ 15 марта 2019

Когда запускается следующий код, фрейм появляется быстро и автоматически закрывается.ОС: Windows 10, Python3.6 Может кто-нибудь помочь мне понять, почему это происходит?

import sys, random, string, base64,time, calendar, io, threading, wx

try:
    #Python 2.7
    import thread
except ImportError:
    #python 3.xx
    import _thread as thread

class gameUI(wx.Frame):
    def __init__(self):
        self._rows = 0
        self._columns = 0
        self._user = None
        app = wx.App()
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        button = wx.Button(panel, id=wx.ID_ANY, label="Press Me")
        button.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        print ("Button pressed!")

def main():
    # try:
        # app = wx.App()
        # frame = wx.Frame(None, title='Simple application')
        # frame.Show()
        # time.sleep(10)
        # app.MainLoop()
    try:
        frame = gameUI()
        frame.Show()
        time.sleep(10)
        app.MainLoop()
    finally:
        del app
if __name__ == '__main__':
    main()

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

У вас все еще есть проблемы.

  • Gui не будет отображаться до тех пор, пока не запустится MainLoop, поэтому команда sleep находится не в том месте, и если вы поставите ее после MainLoop, она не будет активирована, пока Gui не вернется при закрытии то есть MainLoop заканчивается.
  • Определение wx.App все еще не в обычном месте, и где оно есть, он все равно должен быть объявлен как self.app и по-прежнему должен называться frame.app.
  • Поскольку вы, вероятно, новичок в wxpython, вы не используете sizers для позиционирования виджета, поэтому вы должны назначить каждому виджету хотя бы позицию, если не размер (они попытаются измерить себя).

Попробуйте код ниже и обратите внимание на различия.

import sys, random, string, base64,time, calendar, io, threading, wx

try:
    #Python 2.7
    import thread
except ImportError:
    #python 3.xx
    import _thread as thread

class gameUI(wx.Frame):
    def __init__(self,parent,title):
        self._rows = 0
        self._columns = 0
        self._user = None
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        button = wx.Button(panel, id=wx.ID_ANY, label="Press Me", pos=(20,20), size=(80,25))
        quit = wx.Button(panel, id=wx.ID_ANY, label="Quit", pos=(20,50), size=(80,25))
        button.Bind(wx.EVT_BUTTON, self.onButton)
        quit.Bind(wx.EVT_BUTTON, self.onQuit)

    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        print ("Button pressed!")

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

def main():
    try:
        app = wx.App()
        frame = gameUI(None, title='Simple application')
        frame.Show()
        app.MainLoop()
    finally:
        del app
if __name__ == '__main__':
    main()
0 голосов
/ 15 марта 2019

wx.App должно быть создано в первую очередь перед созданием любых окон.
Попытка с окончательно удалить приложение не требуется, приложение будет удалено сборщиком мусора, когда все окна закрыты.
время не было импортировано, поэтому это может привести к ошибке, но вам не нужно ждать 10 секунд, чтобы окно стало отзывчивым, лучше удалить его.

import wx


class gameUI(wx.Frame):

    def __init__(self):
        self._rows = 0
        self._columns = 0
        self._user = None
#         app = wx.App() dont create app here
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
        button = wx.Button(panel, id=wx.ID_ANY, label="Press Me")
        button.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        print ("Button pressed!")


def main():

#     try:
    app = wx.App()
    frame = gameUI()
    frame.Show()
#     time.sleep(10)
    app.MainLoop()


#     finally:
#         del app not required
if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...