radiobutton variable wird nicht übergeben

Fragen zu Tkinter.
Antworten
szhwdr
User
Beiträge: 11
Registriert: Samstag 22. März 2008, 12:40

Samstag 22. März 2008, 14:01

Hello

Ich bin ziemlich neu im programmieren und versteh nicht warum die variable der radiobutton, wenn er selected wird nicht angezeigt wird. Ich erhalte nur ein vermerk py_var1.

Code: Alles auswählen

from Tkinter import *
import random

root = Tk()

def onPress():
        pick = StringVar()
        pick = var.get( )
        print 'you pressed', pick
          
engFFile = '\\\.PSF\\.Home\\Documents\\englisch1.txt'
engFrage = open(engFFile , 'r')
input = [line[:]for line in engFrage.readlines()] 
anzahl = len(input)
a1 = random.randint(0,anzahl)
abfrageWort = ''
abfrageWort = input[a1 - 1]
abfrageWort = abfrageWort.split(':')
erstesWort = abfrageWort[0]
print erstesWort

var = StringVar()
var.set('test')
erstesWortRB = StringVar()
erstesWortRB.set(erstesWort)
rb = Radiobutton(textvariable=erstesWortRB,value=erstesWortRB, variable=var, command=onPress)
rb.grid(row=0, column=0)

root.mainloop()
BlackJack

Samstag 22. März 2008, 14:24

`value` muss eine Zeichenkette sein, bzw. wird in eine Zeichenkette umgewandelt wenn das Objekt in die `variable` gesetzt wird. Und die Zeichenkettenrepräsentation von `Tkinter.StringVar`-Exemplaren ist der interne Name, der in Tk für dieses Objekt benutzt wird.

Code: Alles auswählen

In [153]: var = tk.StringVar()

In [154]: str(var)
Out[154]: 'PY_VAR1'
szhwdr
User
Beiträge: 11
Registriert: Samstag 22. März 2008, 12:40

Samstag 22. März 2008, 14:50

wie schon erwänt, ich bin blutiger anfänger. was heist das genau, was muss ich ändern. sorry das ich nerve
roel
BlackJack

Samstag 22. März 2008, 17:09

Das heisst Du musst als `value` ein Objekt übergeben, dessen Darstellung als Zeichenkette Dir gefällt. Am direktesten also eine Zeichenkette.

Aber vielleicht solltest Du bevor Du mit GUI-Programmierung beginnst erst einmal die Python-Grundlagen bis einschliesslich Objektorientierung lernen.

Der Quelltext enthält ein paar unsinnige Anweisungen. Beispielsweise unnötiges Binden von Namen an Objekte, wo gleich in der nächsten Zeile der Name wieder an ein anderes Objekt gebunden wird. Betrifft die Zeilen 8 und 17.

Dann gibt's die Funktion `random.choice()`. Deine Variante funktioniert auch nur, weil man in Python negative Indexe beim Zugriff auf Listen angeben kann. Wenn das nicht ginge, hätte das Programm einen Fehler.

Zeile 14 ist viel zu komplex. Da werden erst alle Zeilen in eine Liste gelesen und dann machst Du eine Kopie von jeder Zeile und steckst die in eine neue Liste. Ein einfaches ``lines = list(questions_file)`` hätte genügt. Man beachte die trefferenden u. n. abgkz. Namen. Insbesondere ist `input` der Name einer eingebauten Funktion, die man auf diese Weise verdeckt.

Dateien sollte man explizit wieder schliessen.
Antworten