2012-08-31 5 views
0

Je travaille sur une interface graphique simple qui génère une valeur numérique qui est automatiquement copiée dans le presse-papiers. J'essaie de faire clignoter le texte "Copié" dès que cela se produit, apparaissant instantanément puis disparaissant après une seconde ou deux. Que se passe-t-il si le texte clignote comme je le souhaite, mais le champ de sortie affiché ne se met pas à jour tant que le texte n'a pas disparu, ce qui n'est pas l'ordre dans lequel je l'ai écrit. Le but serait que le champ de sortie apparaisse au même moment où le texte apparaît.Texte transitoire dans l'interface graphique avec WXPython

La façon dont j'ai le texte apparaissant est plutôt grossière, donc je suis très ouvert aux suggestions. Des idées et des commentaires seront appréciés.

import sys 
from win32gui import GetWindowText, EnumWindows, ShowWindow, SetForegroundWindow 
import win32clipboard 
import win32con 
import time 
import wx 
from wxPython.wx import * 
import itertools 
from time import sleep 


class MainFrame(wx.Frame): 
    def __init__(self,title): 

     wx.Frame.__init__(self, None, title="RRESI Rounder", pos=(0,0), size=(210,160)) 
     panel=Panel(self) 


class Panel(wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     x1=10; x2=110 
     y1=10; dy=30; ddy=-3 
     boxlength=80 

     self.label1 = wx.StaticText(self, label="Input Number:", pos=(x1,y1+dy*1)) 
     self.Input = wx.TextCtrl(self, value="100.00001", pos=(x2,ddy+y1+dy*1), size=(boxlength,-1)) 

     self.button =wx.Button(self, label="GO", pos=(9999,y1+dy*3)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 
     self.button.SetDefault() 

     self.label0 = wx.StaticText(self, label="Round to closest: 1/", pos=(x1,y1+dy*0)) 
     self.Denominator = wx.TextCtrl(self, value="64", pos=(x2,ddy+y1+dy*0), size=(boxlength,-1)) 

     self.label2 = wx.StaticText(self, label="Output Number:", pos=(x1,y1+dy*2)) 
     self.display = wx.TextCtrl(self, value="100.00000", pos=(x2,ddy+y1+dy*2), size=(boxlength,-1)) 
     self.display.SetBackgroundColour(wx.Colour(232, 232, 232)) 

     self.label3 = wx.StaticText(self, label="   ", pos=(x2+7,y1+dy*2+20)) #Copied 

     self.label4 = wx.StaticText(self, label="", pos=(x2+7,y1+dy*2)) 
     self.label4.SetBackgroundColour(wx.Colour(232, 232, 232)) 

    def OnClick(self,event):  

     def openClipboard(): 
      try: 
       win32clipboard.OpenClipboard() 
      except Exception, e: 
       print e 
       pass 

     def closeClipboard(): 
      try: 
       win32clipboard.CloseClipboard() 
      except Exception, e: 
       print e 
       pass 

     def clearClipboard(): 
      try: 
       openClipboard() 
       win32clipboard.EmptyClipboard() 
       closeClipboard() 
      except TypeError: 
       pass 

     def setText(txt): 
      openClipboard() 
      win32clipboard.EmptyClipboard() 
      win32clipboard.SetClipboardText(txt) 
      closeClipboard() 

     Denominator = float(self.Denominator.GetValue()) 
     Input=float(self.Input.GetValue()) 
     Output=round(Input*Denominator,0)/Denominator 
     self.display.SetValue(str(Output)) 
     setText(str(Output)) 
     self.label4.SetLabel(str(Output)+"") 
     self.label3.SetLabel("Copied") 
     sleep(.5) 
     self.label3.SetLabel("     ") 


if __name__=="__main__": 
    app = wx.App(redirect=False) # Error messages don't go to popup window 
    frame = MainFrame("RRESI Rounder") 
    frame.Show() 
    app.MainLoop() 

Répondre

1

il vous suffit de forcer un redessiner sinon il redessiner l'habitude jusqu'à la prochaine EVT_PAINT est appelé (après la sortie fonction ...) par le sommeil moyen bloque ... cela signifie qu'aucun code est en cours d'exécution à tout pendant qu'il dort

... 
self.label3.SetLabel("Copied") 
self.Update()#force redraw 
.... 
+0

Super! Je vous remercie. Avez-vous des suggestions pour quoi utiliser au lieu de dormir? – Mike

+0

wxTimer est probablement un meilleur choix si vous ne voulez pas bloquer –

Questions connexes