Открытие wx.Frame в Python через новый поток - PullRequest
0 голосов
/ 04 августа 2009

У меня есть рамка, которая существует в качестве начального экрана, чтобы пользователь мог сделать выбор до запуска основной программы. После того, как пользователь делает выбор, мне нужно, чтобы экран оставался как заставка, пока основная программа не закончит загрузку обратно.

Я сделал это, создав приложение и запустив поток:

class App(wx.App):
    '''
    Creates the main frame and displays it
    Returns true if successful
    '''
    def OnInit(self):
        try:
            '''
            Initialization
            '''
            self.newFile = False
            self.fileName = ""

            self.splashThread = Splash.SplashThread(logging, self)
            self.splashThread.start()
            #...More to the class

который запускает фрейм:

class SplashThread(threading.Thread):
    def __init__(self, logger, app):
        threading.Thread.__init__(self)
        self.logger = logger
        self.app = app

    def run(self):
        frame = Frame(self.logger, self.app)
        frame.Show()

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

Есть идеи? Заранее спасибо!

1 Ответ

0 голосов
/ 05 августа 2009

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

import time
import wx


class Loader(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)
        self.btn1 = wx.Button(self, label="Option 1")
        self.btn2 = wx.Button(self, label="Option 2")
        sizer.Add(self.btn1, flag=wx.EXPAND)
        sizer.Add(self.btn2, flag=wx.EXPAND)
        self.btn1.Bind(wx.EVT_BUTTON, self.OnOption1)
        self.btn2.Bind(
            wx.EVT_BUTTON, lambda e: wx.MessageBox("There is no option 2")
        )

    def OnOption1(self, event):
        self.btn1.Hide()
        self.btn2.Hide()
        self.Sizer.Add(
            wx.StaticText(self, label="Loading Option 1..."),
            1, wx.ALL | wx.EXPAND, 15
        )
        self.Layout()
        self.Update()
        AppFrame(self).Show()

class AppFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        time.sleep(3)
        parent.Hide()

        # the top window (Loader) is hidden so the app needs to be told to exit
        # when this window is closed
        self.Bind(wx.EVT_CLOSE, lambda e: wx.GetApp().ExitMainLoop())


app = wx.PySimpleApp()
app.TopWindow = Loader()
app.TopWindow.Show()
app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...