【问题标题】:wxPython Panel Text Not RenderingwxPython面板文本未呈现
【发布时间】:2014-08-12 19:17:27
【问题描述】:

我遇到的问题是,当我在面板内设置静态文本时(参见#Case 2),它只呈现第一个字母。下面的代码是我实际代码的超级精简版,但它产生了相同的结果:

import wx
import time

class TestInterface(wx.Frame):

    testStatusFlag = 0

    def __init__(self, *args, **kw):
        super(TestInterface, self).__init__(*args, **kw)

        self.pnl = wx.Panel(self)

        self.SetSize((450, 225))
        self.SetTitle('example')
        self.Centre()
        self.Show(True)

        self.indicatorFullTest = None
        self.buttonFullTest = None
        self.setTestStatus(status=1) 


    def runTest(self, ev=None):

        self.setTestStatus(status=2)

        #the test is a bunch of functions that take a bunch of time to run
        #they're all located in separate files but all access a single piece of hardware
        #so multithreading is effectively impossible (I don't want to spend days re-writing stuff to accomodate it)
        time.sleep(10)

        self.setTestStatus(status=3)
        return 0


    def setTestStatus(self, ev=None, status=None):

        #Handle the optional status argument
        if (status in [1,2,3]):
            self.testStatusFlag = status

        #Remove any old stuff since if we're calling this function they have to get removed
        if (self.indicatorFullTest != None):
            self.indicatorFullTest.Hide()
        if (self.buttonFullTest != None):
            self.buttonFullTest.Hide()

        #Case 1
        if (self.testStatusFlag == 1):
            self.buttonFullTest = wx.Button( self.pnl, label='Run Test', pos=(125, 100), size=(250, 50))  
            self.buttonFullTest.Bind(wx.EVT_BUTTON, self.runTest)

        #Case 2
        elif (self.testStatusFlag == 2):
            self.indicatorFullTest = wx.Panel( self.pnl, pos=(125, 100), size=(250, 50))
            wx.StaticText(self.indicatorFullTest, wx.ID_ANY, "Full-Board Test now in progress\nAllow up to 6 min to finish...",
                                                  style=wx.ALIGN_CENTRE_HORIZONTAL, pos=(18,7))
            self.indicatorFullTest.SetBackgroundColour( 'Tan' )
            self.Update()

        #Case 3
        elif (self.testStatusFlag == 3):
            self.buttonFullTest = wx.Button( self.pnl, label='Test Complete\nPress to reset GUI', 
                                             pos=(125, 100), size=(250, 50) )
            self.buttonFullTest.SetBackgroundColour( (130,255,130) )
            self.buttonFullTest.Bind(wx.EVT_BUTTON, self.resetGUI)


    #Resets the GUI after a test is complete
    def resetGUI(self, ev=None):
        self.setTestStatus(status=1) #Reset the fullTest button/indicator thing



if __name__ == '__main__':
    ex = wx.App()
    gui = TestInterface(None)
    ex.MainLoop()  

基本上,如何让 UI 完全呈现文本?我想这与更改该指标后不返回 wx 的主循环有关,但我觉得调用 self.Update() 应该使这变得不必要。它也可能与我在使用按钮和使用面板之间切换的方式有关(这可能很糟糕,但我不知道该怎么做)。我知道我可以通过让我的测试函数在单独的线程中运行来解决这个问题,但问题是测试函数调用了我实际上没有时间重写的单独库。

谢谢

【问题讨论】:

    标签: text wxpython rendering panel wxwidgets


    【解决方案1】:

    当您使用 wxPython 的 sizer 时,这会更容易一些,因为您可以只显示和隐藏小部件。你可以在tutorial 中看到一个很好的例子。我建议您学习 sizers,以便在您调整框架大小时让您的 UI 更加动态。

    但无论如何,这个难题的答案非常简单。您需要调用 wx.Yield(),而不是在案例 #2 中调用 self.Update()。我换了一行代码,它在 Linux 上对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2018-07-09
      • 2010-12-31
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多