Problem mit for Schleife.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

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?
[url=http://www.pc-tutos.de/Tutorials/Tutorials.htm]Wie verändert man Spiele oder Computer nach Wunsch? www.PC-Tutos.de[/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Warum nicht so:

Code: Alles auswählen

KEYMAP = dict(zip(KEYS, range(50, 500, 50)))
Stefan
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Antworten