0

クリップボードに自動的にコピーされる数値を出力する単純なGUIに取り組んでいます。これが発生するとすぐに「コピー済み」というテキストを点滅させようとしています。すぐに表示され、1〜2秒後に消えます。

何が起こるかというと、テキストが思い通りに点滅しますが、表示される出力フィールドは、テキストが消えるまで更新されません。これは、スクリプト化した順序ではありません。目標は、テキストが表示されると同時に出力フィールドが更新されるように表示することです。

私がテキストを表示する方法はかなり粗雑なので、私は提案を非常に受け入れています。アイデアやコメントをいただければ幸いです。

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()
4

1 に答える 1

1

そうしないと、次の EVT_PAINT が呼び出されるまで(関数が終了した後...)、スリープがブロックされているため、再描画を強制する必要があります...つまり、スリープ中にコードがまったく実行されないことを意味します

...
self.label3.SetLabel("Copied")
self.Update()#force redraw
....
于 2012-08-31T20:46:12.490 に答える