退出关闭WxPython GUI的密钥

时间:2012-09-06 16:47:41

标签: python wxpython

我正在开发一个相当简单的wxpython GUI,并且希望能够使用转义键关闭窗口。现在我只有一个执行sys.exit(0)的关闭按钮,但是我想要使用转义键来执行此操作。

有没有人知道这样做的方法?

import win32clipboard
import wx
from time import sleep
import sys

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)

        icon = wx.Icon('ruler_ico.ico', wx.BITMAP_TYPE_ICO) 
        self.SetIcon(icon) 

class Panel(wx.Panel):

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

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

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

        self.button2 =wx.Button(self, label="Close", pos=(100,y1+dy*4))
        self.Bind(wx.EVT_BUTTON, self.OnClose, self.button2)
        self.button.SetDefault()

        self.Bind(wx.EVT_KEY_UP, self.OnKeyUP)

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

        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="1.0", 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="Type value and hit Enter", pos=(x1-5,y1-dy*1.5))
        self.label5 = wx.StaticText(self, label="Output is copied", pos=(x1-5,y1-dy*1))
        font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
        self.label4.SetFont(font)
        self.label5.SetFont(font)

    def OnKeyUP(self, event): 
        keyCode = event.GetKeyCode() 
        if keyCode == wx.WXK_ESCAPE: 
            sys.exit(0) 


    def OnClose(self, event):
        print "Closed"
        sys.exit(0)

    def OnClick(self,event):      
        print "You clicked the button!"

        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.label3.SetLabel("Copied")
        self.Update()#force redraw 
        sleep(.5)
        wx.Timer
        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()

2 个答案:

答案 0 :(得分:7)

这种方式有效......有些问题的白痴

[编辑]确定EVT_CHAR_HOOK的效果比EVT_KEY_UP好得多

import wx

class Test(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, -1, title='Event Test',
size=(200, 200))

        panel = wx.Panel(self)

        panel.SetFocus()

        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)

    def OnKeyUP(self, event):
        print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip() 


class App(wx.App):
    """Application class."""

    def OnInit(self):
        self.frame = Test()
        self.frame.Show()
        self.SetTopWindow(self.frame)
        self.frame.SetFocus()
        return True

if __name__ == '__main__':
    app = App()
    app.MainLoop()

答案 1 :(得分:0)

可能更简单的方法是将框架设置为带有取消按钮的对话框(您可以隐藏):

class MainFrame(wx.Dialog):
    ...
    def __init__(self, ...):
        ...
        # the frame must have a cancel button
        cancel_button = wx.Button(..., id=wx.ID_CANCEL)
        # it still works if you hide it
        cancel_button.Hide()

这似乎提供了转义键的默认处理。您甚至可以将它绑定到事件处理程序以在关闭之前执行某些操作 - 如果您执行处理程序必须使用event.Skip(True)传播事件或event.Skip(False)以停止取消操作。