Radiobutton

Fragen zu Tkinter.
Antworten
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Mittwoch 15. November 2006, 15:58

Hallöchen da bin ich mal wieder mit einer Frage:

Und zwar habe ich ein Problem beim Weitergeben von Werten;
Ich habe folgendes ausprobiert:

Code: Alles auswählen

from Tkinter import *
# -*- coding: cp1252 -*-
def hauptteil():
   global anrede, root
   root = Tk()
   root.title('Befragung')
   eingaberahmen = Frame(root)
   eingaberahmen.pack()
   
   anrede = StringVar()

   maennlich = Radiobutton(root, text = 'männlich', 
		variable = anrede, value = 'Herr')
   maennlich.pack()

   weiblich = Radiobutton(root, text = 'weiblich', \
		variable = anrede, value = 'Frau')
   weiblich.pack()

   endeknopf = Button(root, 
   	text='Fertig', command = ausgabe)
   endeknopf.pack(fill = BOTH, expand = 1)
	
   root.mainloop()

def ausgabe():
   global anrede, root
   if not anrede.get():
         geschl = 'er/sie'
   elif anrede.get() == 'Herr':
         geschl = 'er'
   else:
         geschl = 'sie'
   print '%s test' %(anrede.get())
   raw_input()

   root.destroy()

def start():
   root = Tk()
   root.title('Befragung')
   rahmen=Frame(root)
   rahmen.pack()
   Button(root, command=hauptteil).pack()
Wenn ich hauptteil direkt starte (hauptteil() ) läuft alles wie es soll;
Soll heißen: am Ende kommt als Ausgabe zum Beispiel: 'Herr test'
Wenn ich hauptteil nun über start() [Button(command=hauptteil)] starte, kommt als Ausgabe ' test'. Der Wert anrede wird nicht mitgegeben. (Das Programm ist stark gekürzt; aber bei Checkboxen und Edit-Feldern hab ich dasselbe Problem)

Mfg
BlackJack

Mittwoch 15. November 2006, 16:16

Das Programm funktioniert nicht. Da fehlt mindestens ein Aufruf der `mainloop()`-Methode.

Das Problem ist, dass Du maximal ein `Tk`-Objekt gleichzeitig aktiv benutzen kannst. Das ist sozusagen das Hauptfenster. Wenn Du noch weitere Fenster öffnen möchtest, dann musst Du dafür `Toplevel`-Objekte benutzen.

Diese Einschränkung ist auch ein Grund diverser Probleme mit Tkinter Programmen, die man aus IDLE heraus startet. IDLE selbst benutzt schon ein `Tk`-Objekt.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Mittwoch 15. November 2006, 16:23

Hi Ferox,
übergib "hauptteil" doch dein root, das ist besser und eindeutiger als global.Wenn du echt 2 Fenster haben willst, musst du es auch übergeben, und dann Toplevel(root) schreiben...
Gruß, jj
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 15. November 2006, 19:03

Hi,
ist es das was du wolltest?
-Ich habe an deinem Script nichts geändert !

Code: Alles auswählen

from Tkinter import *
# -*- coding: cp1252 -*-

#ich haette das so gemacht!
#global zu benutzen ist keine gute idee

#~ root = Tk()
#~ anrede = StringVar()

def hauptteil():
   global anrede, root
   root = Tk()
   root.title('Befragung')
   eingaberahmen = Frame(root)
   eingaberahmen.pack()
   anrede = StringVar()
   maennlich = Radiobutton(root, text = 'männlich',
        variable = anrede, value = 'Herr')
   maennlich.pack()
   weiblich = Radiobutton(root, text = 'weiblich', \
        variable = anrede, value = 'Frau')
   weiblich.pack()
   endeknopf = Button(root,
       text='Fertig', command = ausgabe)
   endeknopf.pack(fill = BOTH, expand = 1)
   root.mainloop()
def ausgabe():
   global anrede, root
   if not anrede.get():
         geschl = 'er/sie'
   elif anrede.get() == 'Herr':
         geschl = 'er'
   else:
         geschl = 'sie'
   print '%s test' %(anrede.get())
   #raw_input() was soll das raw_input hier machen ?
   root.destroy()
def start():
   root = Tk()
   root.title('Befragung')
   rahmen=Frame(root)
   rahmen.pack()
   Button(root, command=hauptteil).pack() 
   
start()
hauptteil()
ich denke eher nicht.

Gruss
pyStyler
Antworten