Prozeduren an Tastenkürzel binden

Fragen zu Tkinter.
Antworten
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Mittwoch 23. März 2005, 01:09

Guten Abend.
Ich möchte gerne ein Programm komplett per Tastatur steuerbar machen. Dazu möchte ich Funktionen/Prozeduren per Tastendruck Ausführen.
Mit meinen Recherchen habe ich es geschafft, das Programm auf Tastendruck zu beenden und eine Prozedur aufzurufen, die nur von einem Tastendruck aufgerufen wird "print_help()"

Probleme bereitet mir "open_it()".
So wie im Beispiel unten kann ich "open_it()" mit dem Button aufrufen. Der Aufruf per Tastendruck gibt mir einen Fehler:

Code: Alles auswählen

TypeError: open_it() takes no arguments (1 given)
Das open_it() kein Argument zum Aufrufen braucht , das weis ich. Aber woher kommt dann das Argument, das Laut Fehlermeldung mit übergeben wird?

Hier ein Beispiel das den Fehler produziert:

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

import sys, os
import tkFileDialog
import Tkinter as tk

def print_help(event):
    """prints programm infos and  help into txt_output"""
    txt_output.insert(tk.END, " -- Help/Programm Info -- \n\n")

def open_it():
    pic_dir = tkFileDialog.askdirectory()
    btn_pic_dir["text"] = pic_dir

master = tk.Tk()

btn_pic_dir = tk.Button(master, text = "Picture Directory", command = open_it)
btn_pic_dir.pack()
txt_output=tk.Text(master)
txt_output.pack()

master.bind_all("<Escape>", lambda event: master.destroy() )
master.bind_all("<F1>", print_help)
master.bind_all("<F2>", open_it)


master.mainloop()
cu Sebastian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 23. März 2005, 07:10

Guten Morgen!

Bei einem Tastendruck wird ein key-event übergeben (bei print_help hast Du's ja anscheinend noch gewusst :wink:). Wenn Du def open_it(event) nimmst, funktionierts mit dem Tastendruck, aber nicht mehr mit dem Button. Schreib also def open_it(event=None), dann geht beides.

Gruß, mawe
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Mittwoch 23. März 2005, 10:42

bei print_help hast Du's ja anscheinend noch gewusst
Nicht ganz, das habe ich hier irgendwo aus dem Forum geklaut.
Genau so wie du sagst hat es mit def open_it(event) dann nicht mehr funktioniert. Weil dann beim Button benutzen auf einmal ein Argument fehlte.
Gelesen habe ich auch schon, dass ein key-event übergeben wird. Nur wusste ich halt nicht, wo ich ein Argument bei Button Betätigung herbekomme. Zumindest war das die Richtung in die ich gesucht/gedacht habe.
Über diesen Punkt bin ich dann nicht mehr alleine gekommen.

Danke / cu Sebastian
Gast

Montag 23. Mai 2005, 15:40

ich hab da mal so ne frage
ich wollte ein programm auf tastenkomination(alt+f4) beenden
wie mach ich das denn am besten??

Code: Alles auswählen

from Tkinter import *
def end(event=None):
    tk.destroy()
tk=Tk()
tk.bind_all('<Alt>+<F4>',end)
mainloop()
ich bekomm aber nur diese fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "H:/Unterricht/Info/python/Tkprob.pyw", line 5, in -toplevel-
    tk.bind_all('<Alt>+<F4>',end)
  File "C:\Python23\lib\lib-tk\Tkinter.py", line 945, in bind_all
    return self._bind(('bind', 'all'), sequence, func, add, 0)
  File "C:\Python23\lib\lib-tk\Tkinter.py", line 888, in _bind
    self.tk.call(what + (sequence, cmd))
TclError: bad event type or keysym "Alt"
könnte mir mal bitte jemand bei meinem problem helfen??
schonmal danke im voraus
jochim
User
Beiträge: 32
Registriert: Montag 5. August 2002, 20:47
Wohnort: Dortmund

Montag 23. Mai 2005, 16:12

Zum Alt+F4 Problem:
Die korrekte Syntax ist "<Alt-F4>".
Damit funktioniert es.

MfG
Jochim
Antworten