Button Text in Funktion verwenden

Fragen zu Tkinter.
Antworten
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

hallöchen,

ich hab ein kleines (oder auch großes Problem) ... ich habe ein Liste mit strings und möchte zu jedem string einen Button kreieren, auf dem der string als text steht ... mein prob ist, ich möchte eine Funktion, die aufgerufen wird, wenn man auf einen Button klickt, und in der man auch den jeweiligen string verwenden kann. natürlich kann ich die Funktionen dynamisch und mit exec erstellen, aber das verbraucht ja erstens superviel Speicherplatz und zweitens ist nicht gerade sauberprogrammiert.
Bsp:

Code: Alles auswählen

def funktion():
   print string
x=0
y=0
for string in ['H','e','l','l','o',' ','W','o','r','l','d']:
    if x==5:
        x=0
        y+=1
   Tkinter.Button(text=string,command=function).grid(column=x,row=y)
    x+=1

und gleich nochma zu dem Button prob ... wie kann ich so ein schönes gelbes Infofenster anzeigen lassen, wenn man über den Button fährt (beispielsweise, nach dem 1 sec. auf dem Button war öffnet es sich)???
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Mit lambda gehts z.B. so:

Code: Alles auswählen

from Tkinter import *

def function(text):
    print text

root = Tk()
for char in "Hello World":
    Button(text=char, command=lambda c=char: function(c)).pack()
root.mainloop()
Für den Tooltip schau mal ins Cookbook

Gruß, mawe
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

mawe hat geschrieben:Hi!

Mit lambda gehts z.B. so:

Code: Alles auswählen

from Tkinter import *

def function(text):
    print text

root = Tk()
for char in "Hello World":
    Button(text=char, command=lambda c=char: function(c)).pack()
root.mainloop()
Für den Tooltip schau mal ins Cookbook

Gruß, mawe
thx, (hätt ich eigentlich auch selber darauf kommen können *sich selbst vor Dummheit gegen den Kopf hau*)


hätte noch jemand hierfür eine Lösung, denn in dem Buch, was ich habe finde ich dazu nichts:
cime hat geschrieben:wie kann ich so ein schönes gelbes Infofenster anzeigen lassen, wenn man über den Button fährt (beispielsweise, nach dem 1 sec. auf dem Button war öffnet es sich)???
(PS: das mit dem gelb ist nicht so wichtig *g*)
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

cime hat geschrieben: hätte noch jemand hierfür eine Lösung, denn in dem Buch, was ich habe finde ich dazu nichts:
Äh ... *räusper* ... hast Du dir den Link angesehen, den ich Dir in meinem vorigen Post gegeben hab? ;)

Gruß, mawe
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hier mal ein kleines Beispiel zu "dem kleinen gelben Fenster", was ich in einem Programm so ähnlich verwende.
Das Original stammt aus dem Buch "Python und GUI-Toolkits" von Michael Lauer. Vieleicht hilft es dir.

Code: Alles auswählen

from Tkinter import *

class demo:
    def __init__(self):
        self.root = Tk()
        self.fr01 = Frame(self.root)
        self.fr01.pack()
        self.bu01 = Button(self.fr01,text='Testbutton',command=None)
        self.bu01.pack()
        self.balloonhelp = None
        self.afterID = 0
        self.bu01.bind('<Enter>',lambda ev,self=self,tt='Testbutton':
                          self.on_enter(ev,tt))
        self.bu01.bind('<Leave>',self.on_leave)
        self.root.mainloop()

    def on_after(self,text,x,y):
        self.balloonhelp = ToolTip(text,x,y)

    def on_enter(self,event,text):
        #event.widget['relief'] = RAISED # macht bei einem Button aber nicht viel Sinn
        self.afterID = event.widget.after(500,self.on_after,text,event.x_root,event.y_root)

    def on_leave(self,event):
        #event.widget['relief'] = FLAT  # macht bei einem Button aber nicht viel Sinn
        if self.balloonhelp:
            self.balloonhelp.destroy()
            self.balloonhelp = None
        if self.afterID: event.widget.after_cancel(self.afterID)


class ToolTip(Toplevel):
    def __init__(self,text,x,y):
        Toplevel.__init__(self)
        self.overrideredirect(1)
        self.geometry('+%d+%d'%(x-15,y+15))
        label = Label(self,text=text,fg='#000000',
                      bg='#ffffaa',bd=2,relief=RAISED)
        label.pack(fill=BOTH,expand=YES)



if __name__ == '__main__':
    demo()
Stephan
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

ich danke erstmal *g* werds nachher gleich ma ausprobieren.
Antworten