Comment puis-je faire la mise à jour de texte sur plusieurs lignes wx.TextCtrl en douceur?
-
01-10-2019 - |
Question
Je travaille sur un programme d'interface graphique, et j'utiliser AppendText à l'état de mise à jour dans une zone de texte sur plusieurs lignes (en wx.TextCtrl). J'ai remarqué chaque fois qu'il ya une nouvelle ligne écrite dans cette case, au lieu d'ajouter facilement cette ligne à la fin, l'ensemble des textes dans la boîte tout simplement disparaître (pas réel, juste visuellement) et je dois cliquer sur le bouton de défilement pour vérifier la nouvelle mise à jour / ligne d'état écrit. Pourquoi est-ce qui se passe? Dois-je ajouter des styles? Nous espérons que vous les gars peuvent me aider.
Voici mon exemple de code:
import wx
import thread
import time
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent = None, id = -1, title = "Testing", pos=(350, 110), size=(490,530), style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX)
panel = wx.Panel(self)
self.StartButton = wx.Button(parent = panel, id = -1, label = "Start", pos = (110, 17), size = (50, 20))
self.MultiLine = wx.TextCtrl(parent = 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)
def OnStart(self, event):
self.StartButton.Disable()
thread.start_new_thread(self.LongRunning, ())
def LongRunning(self):
Counter = 1
while True:
self.MultiLine.AppendText("Hi," + str(Counter) + "\n")
Counter = Counter + 1
time.sleep(2)
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()
La solution
Essayez d'appeler la méthode Refresh()
sur la textCtrl
Mise à jour:
Une question a déjà été posée au sujet de ce problème, ici est la réponse qui à peu près le résout, -son pas parfait, mais vous pouvez peut-être l'améliorer ...
est un fil de la wxpython liste de diffusion en ce qui concerne le problème qui peut aussi être d'intérêt pour vous.
Autres conseils
essayez ceci:
self.logs = wx.TextCtrl(self, id=-1, value='', pos=wx.DefaultPosition,
size=(-1,300),
style= wx.TE_MULTILINE | wx.SUNKEN_BORDER)
self.logs.AppendText(text + "\n")