Frage zu .get() Funktion

Fragen zu Tkinter.
Antworten
rossmann
User
Beiträge: 4
Registriert: Montag 19. März 2007, 18:47

Guten Tag!
Ich verwende erst seit kurzem Python und komme bei folgendem Problem einfach nicht weiter:

Code: Alles auswählen

from Tkinter import*

#-------------------------------

class test(object):
    def __init__(self):
    
        self.fenster=Tk()
        self.var=IntVar()
        
        Checkbutton(self.fenster, text="Klick mich", offvalue=0, onvalue=1, variable=self.var).pack()
        Button(self.fenster, text="OK", command=self.do_sth).pack()
   
    def do_sth(self):
        print self.var.get()
        
#-------------------------------

#Variante1
#a=test()

#Variante2
def do():
    a=test()
b=Tk()
Button(b, text="OK", command=do).pack()
Wenn ich die Variante 1 ausführe, wird (wenn der Chkbutton angehackt ist) 1 ausgegeben.

Bei der Variante 2 wird immer 0 ausgegeben.

Kann mit bitte irgendjemand weiterhelfen und erklären warum das so ist.
Was muss ich tun, damit es bei der Variante 2 auch funktioniert?

Greetings Christian

Edit (Leonidas): Code in Python-Tags gesetzt.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi Christian, Willkommen im Forum!

1.) Setzt deinen Code mal in Pythontags. (Beim Nachrichtenverfassen der Button mit "Python" drauf) So kann man das ja garnicht lesen, da man nur vermuten kann, was wozu gehört.

2.) Da fehlt die Eventschleife. Um ein Tkinterprogramm zum (fehlerfreien) Laufen zu bringen, musst du am Ende das einzige Tk-Fenster mit .mainloop() initialisieren, sodass Events verarbeitet werden können. Hier hast du, jedenfalls bei Version 2, 2 Hauptfenster, was schonmal nicht geht, bzw. wenn, dann nur mit Fehlern. Wenn du ein zweites Fenster haben möchtest, erzeuge es als Toplevel.

3.) Schreib "import Tkinter (as tk)" statt "from Tkinter import *".

4.) Die Angaben zu on- und offvalue kannst du dir sparen, da das die Defaultwerte sind.

5.) So funktionieren beide Versionen:

Hauptteil:

Code: Alles auswählen

import Tkinter as tk
class test(object):
    def __init__(self,frame=None):
        if frame:
            self.fenster=frame
        else:
            self.fenster=tk.Tk()
        self.var=tk.IntVar()
        tk.Checkbutton(self.fenster, text="Klick mich", variable=self.var).pack()
        tk.Button(self.fenster, text="OK", command=self.do_sth).pack()
        if not frame:
            self.fenster.mainloop()


    def do_sth(self):
        print self.var.get() 

# version 1 oder 2

Version 1:

Code: Alles auswählen

a=test()
version 2:

Code: Alles auswählen

t=tk.Tk()
def do(): 
   a=test(t)

tk.Button(t, text="OK", command=do).pack()
t.mainloop()
Gruß, jj :wink:
rossmann
User
Beiträge: 4
Registriert: Montag 19. März 2007, 18:47

Guten Tag!

Erstmal vielen Dank für die rasche Antwort! Das Prinzip ist mir jetzt soweit klar.
(Sorry wegen der Codeeinbindung, aber ich bin halt neu in der Branche)


Was ich eigentlich machen will, ist ein Hauptfenster zu generieren, von dem aus wieder andere Fenster mit unterschiedlichen Optionen aufgerufen werden können. Ich denke, du hast mir mit Toplevel den richtigen Tipp gegeben. (Oder gibt es da noch andere Möglichkeiten?)

Danke!!
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

rossmann hat geschrieben:Was ich eigentlich machen will, ist ein Hauptfenster zu generieren, von dem aus wieder andere Fenster mit unterschiedlichen Optionen aufgerufen werden können. Ich denke, du hast mir mit Toplevel den richtigen Tipp gegeben. (Oder gibt es da noch andere Möglichkeiten?)
Moin Rossmann,

andere Möglichkeiten um WAS genau zu tun? Ich hätte Dir sinngemäß das gleiche geschrieben, denn es macht genau das, was Du spezifizierst. Du hast ein Programmfenster (Tk) und kannst dann beliebig viele individuelle Fenster (Toplevel) als Kinder davon erzeugen. Nennenswert in dem Zusammenhang ist vielleicht, dass Du den Titel mit

Code: Alles auswählen

self.fenster.title("mein Titel")
und die windowsüblichen 0-8-15 Menüzeilen mit

Code: Alles auswählen

self.fenster.config(menu=MeinMenue)
einstellen kannst.

Wenn Du einen anderen Vorschlag haben möchtest, musst Du eine andere Frage stellen. :lol:

Schöne Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,
mal ein Bsp. zur dynamischen Fenstererzeugung:

Code: Alles auswählen

import Tkinter as tk
class test(object):
    def __init__(self,master, title="default: nix angegeben"):
        self.fenster=tk.Toplevel(master)
        self.fenster.title(title)
        self.var=tk.IntVar()
        tk.Checkbutton(self.fenster, text="Klick mich", variable=self.var).pack()
        tk.Button(self.fenster, text="OK", command=self.do_sth).pack()

    def do_sth(self):
        print self.var.get() 

t=tk.Tk()
l=tk.Label(t, text="Hi, zur Fenstergenerierung hier den Titel reintippen und auf \"ok\" klicken")
l.pack()            
e=tk.Entry()
e.pack()
def do(): 
   a=test(t, e.get())   
tk.Button(t, text="OK", command=do).pack()
t.mainloop()
Gurß, jj
Antworten