Verschachteltes Widget

Fragen zu Tkinter.
Antworten
dazott
User
Beiträge: 3
Registriert: Sonntag 19. April 2020, 20:38

Hallo!
Ich versuche nach einer Auswahl eines Radiobuttons einen Entry-Eintrag zu verwerten.
Leider hab ich keine Ahnung, weshalb es nicht funkt...
Eigentlich dachte ich, dass ich mit "entry1= IntVar()" den Übergabewert der Varaiable in ein "int" umwandle und dann mit "x01=entry1.get()" und "x1=int(x01)" auslesen kann , aber die Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "rb_entry.py", line 25, in rb
x1=int(x01)
ValueError: invalid literal for int() with base 10: ''

lässt mich verzweifeln...

Grüße
d

Code: Alles auswählen

from tkinter import *

   
def rb():
    

    #global r
        
    radio = btn.get()
    r = int(radio)
    if r == 1:
       print(r)
       
       entry1= Entry(root)
       entry1.grid(row = 4, column = 0, pady=2)  
       
       x01=entry1.get()
       x1=int(x01)
       
      
        
    elif r == 2:
        print(r)
        
        entry2= Entry(root)
        entry2.grid(row = 4, column = 0, pady=2)  
        
        x02=entry2.get()
        x2=int(x02)
       
    else:
        print("")

   
root = Tk()
root.geometry('170x120')


btn = IntVar()

entry1= IntVar()
entry2= IntVar()


#select button
btn_1 = Radiobutton(root, pady=1,relief=RIDGE,  text='Button 1', value=1, variable=btn, command=rb, width=20)
btn_1.grid() 
btn_2 = Radiobutton(root, pady=1,relief=RIDGE,  text='Button 2', value=2, variable=btn, command=rb, width=20)
btn_2.grid()


#Exit
exit_button = Button(root,text="Beenden", command=root.destroy).grid(pady=2)


root.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 14090
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dazott: Du kannst keine `Entry`-Objekte erstellen und dann sofort nach dem erstellen deren Inhalt auslesen. Also Du kannst schon, aber das ist dann halt immer die leere Zeichenkette, denn der Benutzer kann da ja erst etwas eingeben wenn die GUI-Hauptschleife die Kontrolle hat/bekommt.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. ``global`` nicht nur auskommentieren, sondern gleich vergessen, dass es dieses Schlüsselwort überhaupt gibt. Das löst keine Probleme, das schafft welche.

Die Namen sind, ausgenommen `root`, durch die Bank weg superschlecht. Man verwendet keine kryptischen Abkürzungen und nummeriert keine Namen. `exit_button` erfüllt diese Kriterien zwar, dafür passt der Name so gar nicht zum Wert: `None`. Der Name ist also sowieso nicht brauchbar. `btn` passt auch nicht zum Wert. Ausser es gibt da tatsächlich etwas sinnvolles das mit `btn` abgekürzt wird.

Sternchen-Importe sind Böse™. Gerade bei `tkinter` holt man sich so fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil tatsächlich verwendet wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
dazott
User
Beiträge: 3
Registriert: Sonntag 19. April 2020, 20:38

@ __blackjack__: Vielen Dank für Deine Schnelle Antwort.
Ich habe alles ein wenig umgeschrieben, habe aber eher das Gefühl, dass ich anstatt das eigentlich Problem zu lösen mir ein zweites geschaffen habe. Leider komme ich nicht zum gewünschten Ziel...aber jedenfalls bekomme ich jetzt keine Fehlermeldung mehr!
Achte nicht auf die Namensgebung..die ist völliger Bullshit!!!

Code: Alles auswählen

import tkinter as tk


class Radiobutton(tk.Frame):
    def __init__(self,master=None):
        tk.Frame.__init__(self,root)
        self.grid()        

        self.RadBtn_1 = tk.Radiobutton(self, text='Button 1',value=1, variable=btn, command=rb)
        self.RadBtn_2 = tk.Radiobutton(self, text='Button 2',value=2, variable=btn, command=rb)
       
        self.RadBtn_1.grid(row=1, column=0,sticky='WE',padx=50, pady=1)   
        self.RadBtn_2.grid(row=2, column=0,sticky='WE',padx=50, pady=1) 
    
         
        

def rb():
    
    
        radio = btn.get()
        r = int(radio)
        
        if r == 1:
           print(r)
           
           label1 = tk.Label(root, text='Entry1:').grid(row = 4, column = 0,sticky='WE')
           entry1 = tk.Entry(root)
           entry1.grid(row = 5, column = 0,sticky='WE')
           
           
            
        elif r == 2:
           print(r)
            
           label2 = tk.Label(root, text='Entry2:').grid(row = 4, column = 0,sticky='WE')
           entry2 = tk.Entry(root)
           entry2.grid(row = 5, column = 0,sticky='WE')
           
                               
                      
        else:
            print("")  
           
             
                    
class SetButton():
    def set_btn(self):
        self.x1=int(entry1.get())
        self.x2=int(entry2.get())
        
            
root = tk.Tk()
root.geometry('200x200')

btn = tk.IntVar()

entry1= tk.IntVar()
entry2= tk.IntVar()



if __name__ == "__main__":
    
    Radiobutton()
    SetButton()
    

# Übergabe der Einträge
Set_button = tk.Button(root,text="SET", command=SetButton).grid(pady=2)

#Exit
exit_button = tk.Button(root,text="Beenden", command=root.destroy).grid(pady=2)


root.mainloop()
dazott
User
Beiträge: 3
Registriert: Sonntag 19. April 2020, 20:38

Ich dachte, dass ich mit dem "SET" ein neues Event auslöse und damit den Eintrag auslesen kann.
Antworten