Seite 1 von 1

tk Button return Werte auslesen

Verfasst: Mittwoch 12. September 2012, 16:07
von heiliga horsd
Moin,

habe eine Funktion in einem Modul welche Werte zurückliefert. Ich importiere dieses Modul und möchte beim Klick auf den Button, der diese besagte Funktion aufruft, die Rückgabewerte irgendwie extrahieren. Wie mach ich das? Hab in der Doku schon bei tkinter nachgeschaut aber nichts gefunden. Gibt's da irgendeinen eleganten Trick?


Gruß,
heiliga horsd

Re: tk Button return Werte auslesen

Verfasst: Mittwoch 12. September 2012, 16:17
von EyDu
Hallo.

Eigentlich sollte dir beim Stellen der Frage schon aufgefallen sein, dass die Frage wenig Sinn macht ;-) Wohin soll denn der RÜckgabewert zurückgegeben werden, so dass du ihn zur Verarbeitung verwenden kannst? GUI-Programmierung funktioniert so nicht, statt Linearität arbeitet man ereignisbasiert. Die durch den Button aufgerufene Funktion hat also selber dafür zu sorgen, dass die Werte irgendwo gespeichert werden oder dass die dazugehörige Berechnung angestoßen wird. Sei es nun direkt oder, bei langen aufgaben, über einen Thread.

Sebastian

Re: tk Button return Werte auslesen

Verfasst: Mittwoch 12. September 2012, 16:24
von heiliga horsd
OK, also quasi sowas?

Code: Alles auswählen

[Tk_init_Zeugs]

a = None

def foo():
    global a
    a = lib.bar()

Button(root, text='Do_sth', command=foo).grid(row=0, column=0)


[Tk_rest_zeugs]
Mir gefällt jedoch das global nicht so sehr...

Re: tk Button return Werte auslesen

Verfasst: Mittwoch 12. September 2012, 16:31
von EyDu
Dann wird es jetzt höchste Zeit, dass du das Model-View-Controller-Pattern verinnerlichst.

Re: tk Button return Werte auslesen

Verfasst: Mittwoch 12. September 2012, 16:43
von heiliga horsd
Das hatten wir in der Schule mit Java, hab da aber mom. gar nicht dran gedacht... Dann werd ich das mal in Python realisieren, Danke!

Re: tk Button return Werte auslesen

Verfasst: Donnerstag 13. September 2012, 20:26
von heiliga horsd
Also ich bekomme inzwischen die Werte rüber, aber wie kann ich nun die Labels, in denen die Werte angezeigt werden sollen, aktualisieren?

Re: tk Button return Werte auslesen

Verfasst: Donnerstag 13. September 2012, 21:57
von deets
Indem du die Labels, in denen die Werte angezeigt werden, aktualisierst. Ist doch ganz einfach.

Mal im Ernst: glaubst du wirklich, du kommst ohne uns Code zu zeigen an eine sinnvolle Antwort? Du hast hier schon > 150 Postings, inzwischen solltest du doch mitbekommen haben, das "geht nicht" nicht geht...

Re: tk Button return Werte auslesen

Verfasst: Samstag 15. September 2012, 12:04
von heiliga horsd
Und wie mach ich das mit dem aktualisieren? "Python tk Label aktualisieren" hilft bei Google nicht groß weiter.

Code hab ich grade nicht zur Hand, dachte es wäre auch nicht nötig bei dem Trivialbeispiel was zu zeigen. Rein prinzipiell (ungetestet und nur zur Veranschaulichung!) sieht das so aus:

Code: Alles auswählen

import random
import tkinter

Class View:
    def __init__(self):
        self.random_number = None
        self.root = tkinter.Tk()
        self.randint_label = tkinter.Label(root, text = self.random_number).grid(row = 0,column = 0)   ## Wie kann ich nun dieses Label in der update-Methode aktualisieren??
        self.update_Button = tkinter.Button(text = "Zufallszahl generieren", command = self.update).grid(row = 0, column = 1)
        self.root.mainloop()
        

    def update(self):
        self.random_number = random.randint(1, 100)

MyView = View()

Re: tk Button return Werte auslesen

Verfasst: Samstag 15. September 2012, 17:11
von deets
Wer Doku liest ist klar im Vorteil:

http://effbot.org/tkinterbook/label.htm

"""
You can associate a Tkinter variable with a label. When the contents of the variable changes, the label is automatically updated:

Code: Alles auswählen

v = StringVar()
Label(master, textvariable=v).pack()

v.set("New Text!")
Also entweder in deinem Button-callback die Textvariable "v" neu setzen, oder mittels label.configure(text="foo") einen neuen Text setzen.

Re: tk Button return Werte auslesen

Verfasst: Sonntag 16. September 2012, 18:04
von heiliga horsd
StringVar() schmeißt folgendn Fehler:

Code: Alles auswählen

[heiliga_horsd@arch ~]$ python
Python 3.2.3 (default, Apr 23 2012, 23:14:44) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from tkinter import *
>>> p = StringVar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/tkinter/__init__.py", line 243, in __init__
    Variable.__init__(self, master, value, name)
  File "/usr/lib/python3.2/tkinter/__init__.py", line 174, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
>>> exit()
Exception AttributeError: "'StringVar' object has no attribute '_tk'" in <bound method StringVar.__del__ of <tkinter.StringVar object at 0x179b890>> ignored


Re: tk Button return Werte auslesen

Verfasst: Sonntag 16. September 2012, 18:34
von EyDu
Die Suche hat keine zwei Minuten gedauert.

Re: tk Button return Werte auslesen

Verfasst: Montag 17. September 2012, 15:25
von heiliga horsd
OK, warum ich StringVar() erst nach der mainloop erstellen kann wusste ich nicht (und ist mir auch nicht ganz klar).
Ich setze nun in der __init__() meine Variable auf None und erst in der Update-Methode mach ich daraus eine StringVar, welche sich aber leider auch nicht verändert.

Code: Alles auswählen

def update(self):
        self.random_number = random.randint(0,100)
        self.displayed_number = StringVar()
        self.displayed_number.set(self.random_number)
        print(self.random_number)
Ich bekomme immer eine andere zufällige Zahl ausgegeben, jedoch bleibt das Label leer und ich verstehe echt nicht, was ich falsch mache...

Re: tk Button return Werte auslesen

Verfasst: Montag 17. September 2012, 15:40
von EyDu
heiliga horsd hat geschrieben:OK, warum ich StringVar() erst nach der mainloop erstellen kann wusste ich nicht (und ist mir auch nicht ganz klar).
Ich denke mal, dass für das Event-System das eine oder andere initialisiert werden muss, sonst wissen die StringVar-Instanzen ja nicht, wo sie die Nachrichten hinschicken sollen, falls sich irgendwo etwas geändert hat.
heiliga horsd hat geschrieben:Ich setze nun in der __init__() meine Variable auf None und erst in der Update-Methode mach ich daraus eine StringVar, welche sich aber leider auch nicht verändert.
So funktioniert das nicht. Das Label hat ja keine Ahnung davon, dass du sel.displayed_number ein neues Objekt zuweist. Du musst bereits beim erstellen des Labels als Wert die StringVar-Instanz übergeben, deets hat ja bereits geschrieben wie es geht. Weiter muss du wahrscheinlich die Zahl vor dem Setzen in einen String umwandeln, vielleicht wird das intern aber auch schon erledigt.

Re: tk Button return Werte auslesen

Verfasst: Montag 17. September 2012, 18:31
von heiliga horsd
Ja, und damit hab ich meine logischen Probleme, wie ich das machen soll.

a) Ich brauche ein Label
b) Dieses Label bekommt die StringVar Instanz
c) Ich lasse mainloop laufen

Ich kann aber keine StringVar-Instanz erzeugen, bevor die mainloop läuft und die mainloop kann ich ja erst laufen lassen, wenn ich das Label definiert habe. Ich komm mir vor wie beim Versuch, den Kreis zu Quadrieren....

Re: tk Button return Werte auslesen

Verfasst: Montag 17. September 2012, 19:08
von EyDu
Doch, du kannst StringVar-Instanzen vor der mainloop erzeugen. Du musst sie allerdings nach dem Aufruf von Tk() erzeugen. Und diesen musst du so oder so vor allen anderen Operationen auf der GUI erzeugen, da du zum erstellen neuer Elemente in jedem Fall das root-Fenster brauchst.

Code: Alles auswählen

root = tk.Tk()
...
v = tk.StringVar()
tk.Label(root, textvariable=v).pack()
...
tk.mainloop()

Re: tk Button return Werte auslesen

Verfasst: Montag 17. September 2012, 19:25
von heiliga horsd
Ah, ich hatte das tk.Tk() erst nachdem ich die StringVar erzeugt hatte, deshalb gings nicht. Jetzt läuft alles einwandfrei, Danke!