Text wxPython面板文本未呈现
我遇到的问题是,当我在面板中设置静态文本时(参见案例2),它只渲染第一个字母。下面的代码是我实际代码的超级精简版本,但它会产生相同的结果:Text wxPython面板文本未呈现,text,wxpython,rendering,panel,wxwidgets,Text,Wxpython,Rendering,Panel,Wxwidgets,我遇到的问题是,当我在面板中设置静态文本时(参见案例2),它只渲染第一个字母。下面的代码是我实际代码的超级精简版本,但它会产生相同的结果: import wx import time class TestInterface(wx.Frame): testStatusFlag = 0 def __init__(self, *args, **kw): super(TestInterface, self).__init__(*args, **kw)
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()应该会使这变得不必要。这也可能与我如何在使用按钮和面板之间进行切换有关(这可能很糟糕,但我不确定如何进行切换)。我知道我可以通过让我的测试函数在一个单独的线程中运行来解决这个问题,但问题是测试函数调用单独的库,而我实际上没有时间重新编写这些库
谢谢当您使用wxPython的Sizer时,这会更容易一些,因为这样您就可以显示和隐藏小部件了。你可以看到一个很好的例子。我建议学习sizers,以便在调整框架大小时使UI更具动态性 但不管怎样,这个难题的答案很简单。在第2种情况下,您需要调用wx.Yield(),而不是调用self.Update()。我在中交换了这一行更改,它在Linux上对我有效