Seite 1 von 1

Button Text in Funktion verwenden

Verfasst: Donnerstag 1. September 2005, 08:21
von cime
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)???

Verfasst: Donnerstag 1. September 2005, 08:35
von mawe
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

Verfasst: Donnerstag 1. September 2005, 17:34
von cime
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*)

Verfasst: Donnerstag 1. September 2005, 19:23
von mawe
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

Verfasst: Donnerstag 1. September 2005, 20:09
von Mawilo
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

Verfasst: Freitag 2. September 2005, 09:02
von cime
ich danke erstmal *g* werds nachher gleich ma ausprobieren.