[Python] Tkinter + functools.partial

Permalänk

[Python] Tkinter + functools.partial

def myfunc(Title='', Content=''): print Title +':\n' +Content root = Tk() Subject = 'Florg' Mail = 'Flim flum flabbidash' Button(root, functools.partial(myfunc, Subject, Mail)).pack()

Kan någon förklara vad jag ska göra för att det här ska fungera?

Tack.

Visa signatur

Hej. Ge mig pengar

Permalänk
Medlem

Button(root, text="en knapptext här", command=<din partial-grej>).pack()
Förstår inte riktigt varför du vill använda partial...

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Är på bärbara nu så jag kan inte kolla, men om problemet var att jag glömde skriva "command=" är det nog dags att gömma mig i ett hål.

Det där är inte den riktiga exemplet jag använder i mitt program, så jag kan väl hoppas

Tack för hjälpen iaf

Visa signatur

Hej. Ge mig pengar

Permalänk

Puh, var inte så dålig.

for TITLE, MAIL in self.App.GoodMails.iteritems(): Button(self.MailTitleFrame, text=Title, command=(lambda: self.ShowMail(TITLE, MAIL))).pack(anchor=NW) def ShowMail(self, Title, Content): pass

self.App.GoodMails är en lista, och den har innehåll, det är dubbelkollat.

edit:

Visade sig att det inte hade något med den här delen att göra, det var sättet jag bytte sida på som failade.

Visa signatur

Hej. Ge mig pengar

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av DenBlåaTomburken

for TITLE, MAIL in self.App.GoodMails.iteritems(): Button(self.MailTitleFrame, text=Title, command=(lambda: self.ShowMail(TITLE, MAIL))).pack(anchor=NW)

Citat:

Ursprungligen inskrivet av Teknocide
Button(root, text="en knapptext här", command=<din partial-grej>).pack()
Förstår inte riktigt varför du vill använda partial...

För att koden inte funkar som man tänkt sig utan t.ex. partial. I fallet ovan kommer TITLE,MAIL vara samma för alla mail då argumenten "fryses" först när man anropar funktionen (då är loopen redan färdig, och TITLE, MAIL innehåller de sista värdena från iterationen av GoodMails).

Det funkar alltså "korrekt" om man bara har ett mail, men inte annars.

Dock evalueras default-argument direkt, så man kan lösa det på andra sätt också:

for TITLE, MAIL in self.App.GoodMails.iteritems(): Button(self.MailTitleFrame, text=Title, command=(lambda t=TITLE,m=MAIL: self.ShowMail(t, m))).pack(anchor=NW)

Visa signatur

g++