Seite 1 von 1

Problem mit for Schleife.

Verfasst: Dienstag 14. Juli 2009, 13:10
von krisi12345
HI!
Ich hab ein Problem auf das Ich einfach nicht komme:
Ich hab eine for Schleife die 9 [mod]tkinter[/mod] Labels mit dem Namen lab erzeugt und dann nebeneinander ".packt".
In einer Funktion soll dann per Tasten-druck ein Ton erzeugt werden und ein bestimmtes Label die Farbe ändern. Leider bekomme Ich das mit der Farbe nicht hin.
Hier ist der Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
import winsound
fenster = Tk()
fenster.title("Klavier")
fenster["bg"] = "white"
texte = [("A","S","D","F","G","H","J","K","L"),("a","s","d","f","g","h","j","k","l"),(50,100,150,200,250,300,350,400,450)]
for i in range(9):
  def ev(event):
    ind = texte[2][texte[1].index(event.char)]
    winsound.Beep(ind, 1000 / 6)
    lab["bg"] = "black"
  lab = Label(width=5,height=10,bg="#BCBCBC",text=texte[0][i],font=("arial",12,"bold"))
  lab.pack(side=LEFT,padx=3,pady=5)
  Widget.bind_all(lab, "<" + texte[1][i] + ">", ev)
fenster.mainloop()
Kann Mir einer helfen?

Verfasst: Dienstag 14. Juli 2009, 14:26
von b.esser-wisser
Das sieht ja Furchtbar aus ;)
Aber prinzipiell fiunktioniert es so:

Code: Alles auswählen

import Tkinter as tk
import winsound
from functools import partial

#Tasten nochmal extra, wegen der Reihenfolge
KEYS = "asdfghjkl"
KEYMAP = dict(zip(KEYS,(50, 100, 150, 200, 250, 300, 350, 400, 450)))
def main():
    fenster = tk.Tk()
    fenster.title("Klavier")
    fenster["bg"] = "white"
    for key in KEYS:
        label = tk.Label(width=5, 
                       height=10, 
                       bg="#BCBCBC", 
                       text=key.upper(), 
                       )
        label.pack(side=tk.LEFT, padx=3, pady=5)
        fenster.bind_all("<%1s>" % key, partial(on_keypress, field=label))
    fenster.mainloop()

def on_keypress(event, field):
    note = KEYMAP[event.char]
    winsound.Beep(note, 1000 // 6)
    field["bg"] = "black"
if __name__ =="__main__": main()
Also ich gebe dem 'eventhandler' das label mit, das geändert werden soll.

hth, Jörg

Verfasst: Mittwoch 15. Juli 2009, 09:09
von sma
Warum nicht so:

Code: Alles auswählen

KEYMAP = dict(zip(KEYS, range(50, 500, 50)))
Stefan

Verfasst: Mittwoch 15. Juli 2009, 10:22
von b.esser-wisser
@sma
So genau hatte ich mir die Zahlen gar nicht angeschaut, aber wenn schon, dann mit itertools.izip() und xrange(), bzw. Python 3 kann auch dict-comprehensions.
Für ein 'richtiges' Klavier müssen da aber sowieso andere Werte hin - war mir aber zu kompliziert :lol: .

hth, Jörg