为什么是wx.产量显然不屈服于窗户下

2024-06-11 12:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个小应用程序中拿出勇气来证明这种行为。在osx下,这是我所期望的工作方式:当你按下按钮时,它会打印“被要求开始工作”,然后出现一个消息框,事情会暂停,直到按下OK按钮,然后它开始打印“yielding”,GUI保持适度的活动。在

import wx
import time

class MainWindow(wx.Frame):
    def __init__(self, parent, id, title):

        wx.Frame.__init__(self, parent, id, title, size=(800, 700))
        self.tabbed = wx.Notebook(self, -1, style=(wx.NB_TOP))

        self.running = RunningPane(self.tabbed)
        self.submissions = SubmissionPane(self.tabbed, self.running)

        self.tabbed.AddPage(self.submissions, "Submit Job")
        self.tabbed.AddPage(self.running, "Running Jobs")
        self.Show()


class SubmissionPane(wx.Panel):
    def __init__(self, parent, run_pane):
        wx.Panel.__init__(self, parent, -1)

        self.run_pane = run_pane

        self.buttonGo = wx.Button(self, -1, "Submit", pos=(290,170))
        self.buttonGo.Bind(wx.EVT_BUTTON, self.OnSubmit)

        self.Show()

    def OnSubmit(self, event):
        self.run_pane.StartWork()
        print "requested work start"
        wx.MessageBox('Job Submitted')
        print "displayed message box"

class RunningPane(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        self.running_log = wx.TextCtrl(self, -1, pos=(35, 210), size=(720,400))
        self.Show()


    def StartWork(self):
        print "Asked to Start Work..."
        wx.CallAfter(self.DoTheWork)
        print "registered the CallAfter"

    def DoTheWork(self):
        print "Actually starting work"
        self.running_log.WriteText("doing..."+"\n")
        for i in range(20):
            print "yielding"
            wx.Yield()
            time.sleep(1)
        print "I pretended to do the work :) "


app = wx.App()
MainWindow(None, -1, 'Application')
app.MainLoop()

但是,在Windows下,直到打印了20个yielding(按下按钮后立即开始),并且GUI在此期间没有响应,对话框才会出现。在

我是否误解了对wx.Yield()的期望?在


Tags: runselfinitdefshow按钮runningtabbed
1条回答
网友
1楼 · 发布于 2024-06-11 12:22:00

您必须记住,wxPython在每个操作系统上都包装了本机小部件。如果本机widget在Windows上的行为与在Linux或Mac上不同,那么对于该操作系统来说,这可能是正常的。我猜这就是这里发生的事情。一个简单的解决方法是切换到wx.message对话框你可以用情态表现出来。所以换掉你创建wx.MessageBox有了这两个:

msg = wx.MessageDialog(self, 'Job Submitted', "Job", wx.OK)
msg.ShowModal()

相关问题 更多 >