Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Probleme mit dem Auslesen von TKinter-Radiobuttons per Kontrollvariable

44 views
Skip to first unread message

Sebastian Holler

unread,
May 24, 2007, 2:19:28 AM5/24/07
to
Hallo Newsgruppe!

Bereits seit 3 Tagen schlage ich mich mit folgendem Problem herum:

Ich erzeuge ein Setup-Fenster (TKinter) mit einer Reihe von
Radiobuttons. Jedoch ist die Kontrollvariable der Buttons bei mir immer
'0'(Null) und zeigt nie auf den Wert des gerade aktiven Radiobuttons.

Nun endlich habe ich herausgefunden, dass dies daran liegt, dass zu
diesem Zeitpunkt noch ein anderes Fenster offen ist. Erst wenn dies
zuvor per .destroy() entfernt worden ist, funktionieren die Radiobuttons
im Setup-Fenster.

mein Testscript:

---------------------------------------------
# -*- coding: cp1252 -*-

from Tkinter import *

class rbtest(object):

def __init__(self):
def uebernehmen():
deKatExportLimit=deKatExLimAuswahl.get()
print 'Radiobuttonauswahl: ' + str(deKatExLimAuswahl.get())
sFenster.destroy()

sFenster = Tk()
deKatExportLimit=0
deKatExLimAuswahl = IntVar()
deAtfExLimAuswahl = IntVar()
sFenster.title('Einstellungen: DEroh-Katalog - Export')

fra_ExLims = Frame(master=sFenster, relief=FLAT, bd=2, padx=5,
pady=5)
Label(master=fra_ExLims,
text='Beschränkungen in der zu exportierenden Büchermenge',
justify=LEFT, font=('Verdana',8,'bold')).pack(anchor=W)

fra_deKatExLim = Frame(master=fra_ExLims, relief=RIDGE, bd=2,
padx=5, pady=5)
Label(master=fra_deKatExLim,
text='maximale Anzahl an\nBüchern, die im In-\nternet
veröffentlicht\nwerden (deKat):',
justify=LEFT, font=('Verdana',8)).pack(anchor=W)
rbt_deKatExLim = []
rbt_deKatExLim.append(Radiobutton(master=fra_deKatExLim,
text='alle (kein Limit)', value=0))
rbt_deKatExLim.append(Radiobutton(master=fra_deKatExLim,
text='bis zu 10', value=1))
rbt_deKatExLim.append(Radiobutton(master=fra_deKatExLim,
text='bis zu 50', value=2))
rbt_deKatExLim.append(Radiobutton(master=fra_deKatExLim,
text='bis zu 200', value=3))
rbt_deKatExLim.append(Radiobutton(master=fra_deKatExLim,
text='bis zu 1000', value=4))
for rButton in rbt_deKatExLim:
rButton.configure(variable=deKatExLimAuswahl,
font=('Verdana',8))
rButton.pack(anchor=W)
rbt_deKatExLim[deKatExportLimit].select()
fra_deKatExLim.pack(side=LEFT, padx=5, pady=5)

fra_ExLims.pack()
fraBTNRahmen = Frame(master=sFenster, relief=FLAT, bd=2,
padx=5, pady=5)
Button(master=fraBTNRahmen, text='Übernehmen',
font=('Verdana',8), width=14, command=uebernehmen).pack(side=LEFT, padx=5)
Button(master=fraBTNRahmen, text='Standardwerte',
font=('Verdana',8), width=14, fg='gray').pack(side=LEFT, padx=5)
Button(master=fraBTNRahmen, text='Abbrechen',
font=('Verdana',8), width=14, command=sFenster.destroy).pack(side=LEFT,
padx=5)
fraBTNRahmen.pack()

sFenster.mainloop()

#hauptFenster = Tk()

zusatzFenster = rbtest()

-----------------------------------------

Je nachdem, ob man die Zeile <hauptFenster = Tk()> auskommentiert oder
nicht, liefert die Kontrollvariable über <deKatExLimAuswahl.get()> ein
korrektes Ergebnis oder eben immer '0'.

Gibt es eine Lösung für dieses Problem ?


Vielen Dank schon mal im Voraus,

Sebastian H.

Peter Otten

unread,
May 24, 2007, 2:58:55 AM5/24/07
to
Sebastian Holler wrote:

> Ich erzeuge ein Setup-Fenster (TKinter) mit einer Reihe von
> Radiobuttons. Jedoch ist die Kontrollvariable der Buttons bei mir immer
> '0'(Null) und zeigt nie auf den Wert des gerade aktiven Radiobuttons.
>
> Nun endlich habe ich herausgefunden, dass dies daran liegt, dass zu
> diesem Zeitpunkt noch ein anderes Fenster offen ist. Erst wenn dies
> zuvor per .destroy() entfernt worden ist, funktionieren die Radiobuttons
> im Setup-Fenster.
>
> mein Testscript:

[snip]

> Je nachdem, ob man die Zeile <hauptFenster = Tk()> auskommentiert oder
> nicht, liefert die Kontrollvariable über <deKatExLimAuswahl.get()> ein
> korrektes Ergebnis oder eben immer '0'.
>
> Gibt es eine Lösung für dieses Problem ?

Vielleicht hängt das damit zusammen, dass du zwei Tk()-Instanzen erzeugst.
Probier mal

class RbTest(object):
def __init__(self):
# ...
sFenster = Toplevel()
# ...
# KEIN sFenster.mainloop()

hauptFenster = Tk()
zusatzFenster = RbTest()
hauptFenster.mainloop()

Peter

Marc 'BlackJack' Rintsch

unread,
May 24, 2007, 3:28:13 AM5/24/07
to
In <f33apn$g53$1...@online.de>, Sebastian Holler wrote:

> Je nachdem, ob man die Zeile <hauptFenster = Tk()> auskommentiert oder
> nicht, liefert die Kontrollvariable über <deKatExLimAuswahl.get()> ein
> korrektes Ergebnis oder eben immer '0'.
>
> Gibt es eine Lösung für dieses Problem ?

Das liegt ganz bestimmt daran, dass zwei `Tk`-Objekte existieren. Das
sollte man auf keinen Fall machen. Das "Hauptobjekt" mit der
Hauptschleife darf es nur einmal geben, sonst können die lustigsten
Effekte auftreten.

Ciao,
Marc 'BlackJack' Rintsch

Sebastian Holler

unread,
May 24, 2007, 5:50:42 AM5/24/07
to
Hallo Peter !

So funktioniert es tatsächlich. Vielen Dank!!!
(die Funktion Toplevel() wurde in meinem Python-Buch nie erwähnt -
ebensowenig wie die Probleme, die mit zwei und mehr Tk-Instanzen
einhergehen)


Sebastian H.

Peter Otten schrieb:

Sebastian Holler

unread,
May 24, 2007, 5:53:30 AM5/24/07
to
Hallo Marc!

Stimmt, da lag das Problem. Nur hatte ich bislang noch nie einen Hinweis
darauf gefunden, dass es nicht mehr als eine Tk-Instanz in einem
Python-Script geben darf.

Sebastian H.

Marc 'BlackJack' Rintsch schrieb:

0 new messages