كيف تأتي طريقة إنهاء الموضوع هذه لا تعمل؟
-
25-09-2019 - |
سؤال
لقد خرجت للتو بطريقتي noob في إنهاء موضوع ، لكنني لا أعرف لماذا لا يعمل. هل سيساعدني أحدهم؟
هذا هو رمز العينة الخاص بي:
import wx
import thread
import time
import threading
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent = None, id = -1, title = "Testing", pos=(350, 110), size=(490, 200), style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX)
self.panel = wx.Panel(self)
self.stop = False
self.StartButton = wx.Button(parent = self.panel, id = -1, label = "Start", pos = (110, 17), size = (50, 20))
self.MultiLine = wx.TextCtrl(parent = self.panel, id = -1, pos = (38, 70), size = (410, 90), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_AUTO_URL)
self.Bind(wx.EVT_BUTTON, self.OnStart, self.StartButton)
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnStart(self, event):
self.StartButton.Disable()
self.NewThread = threading.Thread(target = self.LongRunning)
self.NewThread.start()
def OnClose(self, event):
self.stop = True
BusyBox = wx.BusyInfo("Just a moment please!", self)
wx.Yield()
while True:
try:
if not self.NewThread.isAlive():
self.Destroy()
break
time.sleep(0.5)
except:
self.Destroy()
break
def LongRunning(self):
Counter = 1
while True:
time.sleep(2)
print "Hello, ", Counter
self.MultiLine.AppendText("hello, " + str(Counter) + "\n") #If you comment out this line, everything works fine. Why can't I update the fame after I hit the close button?
Counter = Counter + 1
if self.stop:
break
class TestApp(wx.App):
def OnInit(self):
self.TestFrame = TestFrame()
self.TestFrame.Show()
self.SetTopWindow(self.TestFrame)
return True
def main():
App = TestApp(redirect = False)
App.MainLoop()
if __name__ == "__main__":
main()
كما ترون في الكود الخاص بي ، هناك حلقة لا حصر لها في الموضوع ، ما أقوله لخيط العمل هو الخروج من الحلقة بمجرد النقر فوق الزر "إغلاق". ولكن المشكلة هي ، في كل مرة عندما أضغط على الزر الإغلاق ، يبدو أن الكود عالق في self.MultiLine.AppendText("hello, " + str(Counter) + "\n")
خط ، أنا لا أعرف لماذا. أي شخص يمكن أن يساعد؟
المحلول
حاول استخدام طريقة آمنة لخيط مثل wx.CallAfter
عند تحديث multiline الخاص بك.
def LongRunning(self):
Counter = 1
while True:
time.sleep(2)
print "Hello, ", Counter
wx.CallAfter(self.updateMultiLine, "hello, " + str(Counter) + "\n")
Counter = Counter + 1
if self.stop:
break
def updateMultiLine(self, data):
self.MultiLine.AppendText(data)
نصائح أخرى
بشكل عام مع مجموعات أدوات واجهة المستخدم الرسومية ، يجب أن يصل مؤشر ترابط واحد فقط إلى وظائف واجهة المستخدم الرسومية. استثناء WX.Callafter
كما تعلمون ، يمكن تصنيف عيوب البرامج إلى ثلاث مجموعات:
- الحشرات الخاصة بك.
- حشراتهم.
- الخيوط.
;)
لا تنتمي إلى StackOverflow