button hotkey erstellen?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

Dienstag 17. Januar 2006, 12:18

Hallo!

Ich habe ein kleines Programm erstellt, dass immer eine bestimmte Aktion durchführt, wenn man unten in der Menüleiste auf den button klickt.

Ich hätte es gerne so, dass ich einen hotkey für diesen button-Klick einrichte.

Hab bis jetzt folgende Lösungsmöglichkeit, die aber leider nicht klappt. (sollte sie aber, darum denke ich, dass ich vielleicht nur einen Syntax-Fehler eingebaut hab).

Code: Alles auswählen

import wx


class TaskBarApp(wx.Frame):
	def __init__(self, parent, id, title):
		wx.Frame.__init__(self, parent, -1, title, size = (1, 1),
			style=wx.FRAME_NO_TASKBAR|wx.NO_FULL_REPAINT_ON_RESIZE)
		#
		# create the TaskBarIcon
		self.tbicon = wx.TaskBarIcon()
		icon = wx.Icon('images/myIcon.ico', wx.BITMAP_TYPE_ICO)
		self.tbicon.SetIcon(icon, '')
		wx.EVT_TASKBAR_LEFT_UP(self.tbicon, self.OnTaskBarLeftClick)
		self.Show(True)
		
		#
		# here i create my hotkey
		self.clickID = wx.NewId()
		self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.OnTaskBarLeftClick, id=self.clickID)
		x = [(wx.ACCEL_NORMAL, wx.WXK_F3, self.clickID), (wx.ACCEL_CTRL, ord('H'), self.clickID)]
		atable = wx.AcceleratorTable(x)
		self.SetAcceleratorTable(atable)
		
		
	def OnTaskBarLeftClick(self, evt):
		print "left-click"
		
		
	

class MyApp(wx.App):
	def OnInit(self):
		frame = TaskBarApp(None, -1, ' ')
		return True

def main():
	app = MyApp(0)
	app.MainLoop()

if __name__ == '__main__':
	main()
Ich hoffe mir kann jemand helfen!
Grüße, Kathrin!
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Dienstag 17. Januar 2006, 16:04

Hallo,

nach einigem Probieren hat es dann funktioniert.

Du brauchst die Funktionen
RegisterHotKey und das event wx.EVT_HOTKEY:


http://www.wxwidgets.org/manuals/2.6.2/ ... sterhotkey
(hier steht auch, dass es momentan nur unter Windows funktioniert).

Ich habe das Programm ein bisschen abgeändert.
(Alt-K würde in diesem Fall die Funktion auslösen)

Code: Alles auswählen

import wx

class TaskBarApp(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, -1, title, size = (1, 1),
            style=wx.FRAME_NO_TASKBAR|wx.NO_FULL_REPAINT_ON_RESIZE)
        #
        # create the TaskBarIcon
        self.tbicon = wx.TaskBarIcon()
        icon = wx.Icon('images/myIcon.ico', wx.BITMAP_TYPE_ICO)
        self.tbicon.SetIcon(icon, '')
        wx.EVT_TASKBAR_LEFT_UP(self.tbicon, self.OnTaskBarLeftClick)
        self.Show(True)


        self.RegisterHotKey(1, wx.MOD_ALT, ord ('K'))
        self.Bind(wx.EVT_HOTKEY, self.OnTaskBarLeftClick, id=1)

        # here i create my hotkey
        self.clickID = wx.NewId()
        self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.OnTaskBarLeftClick, id=self.clickID)
       

    def OnTaskBarLeftClick(self, evt):
        print "left-click"
        self.tbicon.Destroy()
        self.Close(True)
        wx.GetApp().ProcessIdle()       
      

class MyApp(wx.App):
    def OnInit(self):
        frame = TaskBarApp(None, -1, ' ')
        frame.Show(False)
        return True

def main():
    app = MyApp(0)
    app.MainLoop()

if __name__ == '__main__':
    main()
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

Donnerstag 19. Januar 2006, 10:36

Dankeschön, klappt soweit ganz gut, obwohl es mit wx.AcceleratorTable() eigentlich auch hätte funktionieren müssen. :?:

Aber so tut's ja auch :D

Aber mit RegisterHotkey setz ich den hotkey doch für das komplette System, oder? Kann das nicht evtl. zu Problemen führen? Es würde nämlich reichen, wenn mein hotkey nur gilt, während mein Programm läuft.

Viele Grüße, Kathrin!
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Donnerstag 19. Januar 2006, 11:08

Kathrin hat geschrieben:Dankeschön, klappt soweit ganz gut, obwohl es mit wx.AcceleratorTable() eigentlich auch hätte funktionieren müssen. :?:
Bitte.
Weiss ich leider nicht, aber ich glaube wx.AcceleratorTable funktioniert nur,
wenn die Applikation den Focus hat.
Kathrin hat geschrieben: Aber so tut's ja auch :D

Aber mit RegisterHotkey setz ich den hotkey doch für das komplette System, oder? Kann das nicht evtl. zu Problemen führen? Es würde nämlich reichen, wenn mein hotkey nur gilt, während mein Programm läuft.

Viele Grüße, Kathrin!
Wenn das Programm beendet wurde, müsste auch die Wirkung des
Hotkeys aufgehoben sein (denke ich mir einfach).
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

Donnerstag 19. Januar 2006, 11:44

Jo, hast recht ...

Noch ne kurze Frage: also meine hotkeyID ist doch in diesem Fall 1, oder?!
Also warum klappt das Löschen meines hotkeys mit

Code: Alles auswählen

self.UnregisterHotKey(1)
nicht?

Würde nämlich gerne den Benutzer den hotkey ändern lassen, also hierfür den alten Löschen und den Neuen eintragen.

Danke, Kathrin!
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Donnerstag 19. Januar 2006, 14:03

Kathrin hat geschrieben:Jo, hast recht ...

Noch ne kurze Frage: also meine hotkeyID ist doch in diesem Fall 1, oder?!
Also warum klappt das Löschen meines hotkeys mit

Code: Alles auswählen

self.UnregisterHotKey(1)
nicht?

Würde nämlich gerne den Benutzer den hotkey ändern lassen, also hierfür den alten Löschen und den Neuen eintragen.

Danke, Kathrin!
Hm, weiss ich auch nicht.

Es gibt aber auch noch ein Unbind (vielleicht muss man das auch noch
aufrufen)

in etwa:

Code: Alles auswählen

self.Unbind(wx.EVT_HOTKEY, self.OnTaskBarLeftClick, id=1)
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

Donnerstag 19. Januar 2006, 15:43

Hmm, ist grad alles bissal komisch bei mir ... :(
krieg für den Unbind-Befehl ne Fehlermeldung:

self.Unbind(wx.EVT_HOTKEY, self.OnTaskBarLeftClick, id=1)
File "C:\Programme\Python24\Lib\site-packages\wx-2.5.3-msw-ansi\wx\_core.py", line 2742, in Unbind
id = source.GetId()
AttributeError: 'function' object has no attribute 'GetId'

Mal schauen, ist wahrscheinlich nur irgendein kleiner Fehler ...
Aber danke für deine Hilfe!
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Donnerstag 19. Januar 2006, 16:08

Kathrin hat geschrieben:Hmm, ist grad alles bissal komisch bei mir ... :(
krieg für den Unbind-Befehl ne Fehlermeldung:

self.Unbind(wx.EVT_HOTKEY, self.OnTaskBarLeftClick, id=1)
File "C:\Programme\Python24\Lib\site-packages\wx-2.5.3-msw-ansi\wx\_core.py", line 2742, in Unbind
id = source.GetId()
AttributeError: 'function' object has no attribute 'GetId'

Mal schauen, ist wahrscheinlich nur irgendein kleiner Fehler ...
Aber danke für deine Hilfe!
Habe gerade "Unbind" gesucht.
(das source ist nicht die funktion)

Code: Alles auswählen

def Unbind(self, event, source=None, id=wx.ID_ANY, id2=wx.ID_ANY):
        """
        Disconencts the event handler binding for event from self.
        Returns True if successful.
        """
        if source is not None:
            id  = source.GetId()
        return event.Unbind(self, id, id2)
Meist wird nur
Unbind(<event>) (ohne zusätzliche Parameter verwendet).

Vielleicht genügt hier:

Code: Alles auswählen

self.Unbind(wx.EVT_HOTKEY)
oder

Code: Alles auswählen

self.Unbind(wx.EVT_HOTKEY, id=1)
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

Donnerstag 19. Januar 2006, 16:56

Danke, jetzt klappts! :D
Antworten