Radiobutton Variable in def

Fragen zu Tkinter.
Antworten
Splexx
User
Beiträge: 4
Registriert: Freitag 21. Oktober 2016, 09:23

Ich habe ein Konfigurationsfenster erstellen die durch eine Funktion ausgelöst wird.
Jetzt habe ich das Problem, dass ich keinen Wert vom Radiobutton bekomme wenn ich .get() benutze.

Code: Alles auswählen

p = IntVar ( )

def _triggerPanel ( )
	sText = p.get()
	if sText == 1 :
		print("ja")
	else :
		print("nein")
	return

def _createUserPanel ( ) :
    _uP = Tk ( )
    _uP.title("Konfiguration")
    S1R = Radiobutton ( _uP, text = S1, padx = 20, value = 1, variable = p ).grid ( row=5, column=1 )
    SAB = Button ( _uP, text = "Auswaehlen", command = _triggerPanel ).grid (row=11, column=1 )
  

Danke im Vorraus
Gruß Splexx
Zuletzt geändert von Anonymous am Freitag 21. Oktober 2016, 09:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Splexx: Könntest Du ein lauffähiges Beispiel zeigen bei dem das Problem auftritt? Der gezeigte Code kompiliert so nicht einmal und selbst wenn man `IntVar` importiert, löst gleich die erste Zeile eine Ausnahme aus weil zu dem Zeitpunkt noch kein `Tk`-Exemplar existiert.

Die Leerzeichensetzung ist übrigens extrem irritierend; die hält sich so gar nicht an die üblichen Konventionen: Style Guide for Python Code.

Edit: Die Namensschreibweisen halten sich auch nicht an den Style Guide. Was soll der führende Unterstrich bei lokalen Namen bedeuten?

Namen wie `p`, `_uP`, `S1`, `S1R`, und `SAB` sind schlecht gewählt, weil der Leser daraus keine Informationen ziehen kann wenn er nicht sowieso schon weiss was diese kryptischen Kürzel bedeuten sollen.

`S1R` und `SAB` sind zudem sinnfrei weil die beide an den Wert `None` gebunden werden. Das ist der Rückgabewert der `grid()`-Methode.

Insgesamt hinterlässt der Quelltext den Eindruck als wären da ein paar ”Totsünden” begangen worden: Sternchen-Import, globale Variablen, und keine objektorientierte Programmierung.
Splexx
User
Beiträge: 4
Registriert: Freitag 21. Oktober 2016, 09:23

So würde der ganze Code aussehen. Bin noch relativ neu was Python angeht.

Soll ich IntVar in eine definition packen ?

Code: Alles auswählen

from Tkinter import*

Autotext = "1.0"
p = IntVar ( )

def triggerPanel ( ) : # Anwenden ausloeser
    sText = p.get ( )
    if Autotext == "1.0" :
        if sText == 1 :
            print("1")
        else :
            print("2")
        return
    return



def createUserPanel ( ) :
    master = Tk ( )
    master.title("Ampelkonfiguration")

    Label ( master ). grid ( row = 4, column = 1 )
    Label ( master ).grid ( row = 5, column = 1 )

    
    Seq1 = Radiobutton ( master, text = S1, padx = 20, value = 1, variable = p ).grid ( row=5, column=1 )
    Seq2 = Radiobutton ( master, text = S2, padx = 20, value = 2, variable = p ).grid ( row=6, column=1 )
    Seq3 = Radiobutton ( master, text = S3, padx = 20, value = 3, variable = p ).grid ( row=7, column=1 )
    Seq4 = Radiobutton ( master, text = S4, padx = 20, value = 4, variable = p ).grid ( row=8, column=1 )
    Seq5 = Radiobutton ( master, text = S5, padx = 20, value = 5, variable = p ).grid ( row=9, column=1 )
    Seq6 = Radiobutton ( master, text = S6, padx = 20, value = 6, variable = p ).grid ( row=10, column=1 )
    SeqButton = Button ( master, text = "Auswaehlen", command = triggerPanel ).grid (row=11, column=1 )

    
    master.mainloop ( )

edit: ist eine Schreibweise von mir und das Script wird hauptsächlich Privat benutzt. Mit OOP kenne ich mich noch zu wenig um es anwenden zu können
Zuletzt geändert von Splexx am Freitag 21. Oktober 2016, 10:17, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Splexx: Du stellst hier eine Frage in einem öffentlichen Forum, also ist Dein Code nicht mehr privat. Wenn Du willst, dass sich andere Leute mit Deinem Problem beschäftigen, dann mach es ihnen so einfach wie möglich, indem Du Dich an die von BlackJack angesprochenen Konventionen hältst. Gute Variablennamen helfen auch Dir, Deinen Code noch morgen zu verstehen.

Der "ganze Code" ist immer noch unvollständig. Es fehlen die Importe und IntVar wird immer noch vor irgendeiner Tk-Instanz erzeugt.
Splexx
User
Beiträge: 4
Registriert: Freitag 21. Oktober 2016, 09:23

Code wurde geändert
BlackJack

@Splexx: Zeile 4 führt immer noch zu einer Ausnahme. Kann es sein, dass Du in Deinem tatsächlichen Programm mehr als ein `Tk`-Exemplar zur gleichen Zeit hast? Das darf nicht sein, weil `Tk` *das* Hauptfenster repräsentiert und da auch der Tk/Tcl-Interpreter dran hängt. Das darf es alles nur einmal geben, sonst gibt es undefiniertes Verhalten.
Splexx
User
Beiträge: 4
Registriert: Freitag 21. Oktober 2016, 09:23

Problem gelöst danke

hatte wie gesagt mehrere Tk Objekte. Steuere jetzt per os.system die anderen Tk Objekte an
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Splexx: Problem durch ein schlimmeres ersetzt. Wenn man mehrere Fenster in *einer* Anwendung hat, dann sind diese vom Typ TopLevel, da braucht man nichts in mehrere Programme aufspalten.
Antworten