Entry neben Radiobutton

Fragen zu Tkinter.
Antworten
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Hi @ all,

ich weiß mal wieder nicht weiter...

Ich habe in Tkinter eine Auswahl, mit Radiobuttons, innerhalb einer Rahmens.
Jetzt will ich dass 2 Radiobuttons untereinander stehen, wobei der eine defaultmäßig ausgewählt ist, und der andere links von einem Eingabefeld stehen soll, welches deaktiviert/grau ist und erst dann aktiviert ist, wenn der Radiobutton nebenan angeklickt wird...

Also erstmal: wie bekomm ich einen Radiobutton und ein Entry nebeneinander und wie sind die zu verknüpfen, damits Entry erst aktiv ist, wenn der Radiobutton angeklickt wurde?

1000 dank für die Hilfe
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

also ich hab jetzt den Radionutton und das entry nebeneinander...

Jetzt tut sich mir eine andere Idee auf und über die Suchfunktion und www-recherge komm ich nicht wirklich weiter...

Prinzipiell:
Ich will über einen "go"-Button ein Programm starten lassen. Jetzt sollte es aber so sein, dass dieser Button inaktiv angezeigt wird, bis z.B.: 2 Bedingungen erfüllt sind.
Zum Beispiel soll er inaktiv sein, bis der Programmpfad in einem Entry steht und die Anzahl der Iterations angegeben wurde(auch ein Entry !!!).

Also was sich hinter dem Pfad und den Iterations befindet ist egal, es geht nur um diese: Bedingung erfüllt-->Button aktiv Geschichte.

Aber bitte: Gebt mir jetzt keine Antworten mit Links auf z.B. effbot o.ä.
Da bin ich schon durch und komm nicht weiter...

danke@all
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du könntest beide Entry-Felder mit einem KeyPress- oder KeyRelease-Event verbinden. Der Event-Handler prüft, ob die Eingabe okay ist (z.B. gültiger Pfad) und setzt im Fall der Gültigkeit den Button von DISABLED auf NORMAL.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Pü-Ton

Hier noch eine von Tausend Varianten zum ausprobieren.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
Funktion: Beim aktivieren der Radio-Schaltfläche links neben dem
          Eingabe-Feld gibt das Eingabe-Feld für die Eingabe frei.
          Das aktivieren der oberen Radio-Schaltfläche sperrt das
          Eingabe wieder.
"""

import Tkinter as tk

def radio_button_call():
    """Ein Radio-Schaltfläche wurde aktiviert"""

    button_nr = radio_button_state.get()

    print 'Meine-Nummer ist =',button_nr

    if button_nr == 1:
        #~~ Freigabe des Eingabe-Feldes
        entry_1['state'] = 'normal'
    else:
        #~~ Sperrung des Eingabe-Feldes
        entry_1['state'] = 'disabled'

#--- Erstelle ein Tk-Hauptfenster ----
root = tk.Tk()
root.geometry('250x150')
root['bg'] = 'steelblue2'
root.title('Status-Steuerung')

#~~ Ein wenig Werbung
slogan_label = tk.Label(root,
    bg   = root['bg'],
    fg   = 'yellow', #'white', #'lightyellow',
    text = 'Powered by Python & Tkinter',
    font = ('Helvetica','10','normal')
    )
slogan_label.place(x=30,y=120)

#~~ Rahmen für die Radio-Schaltfächen und das Eingabefeld
button_frame = tk.Frame(root,
    bd     = 2,
    bg     = root['bg'],
    padx   = 5,
    pady   = 5,
    relief = 'groove',
    )
button_frame.place(x=30,y=30)

#~~ Kontrollvariable für den Zustand der Radio-Schaltflächen
radio_button_state = tk.IntVar()
radio_button_state.set(0)

#~~ Radio-Schaltfläche-1
radio_button_1 = tk.Radiobutton(button_frame,
    bd = 1,
    bg = button_frame['bg'],
    highlightthickness = 0,
    activebackground   = button_frame['bg'],
    value = 0,
    variable = radio_button_state,
    command  = radio_button_call,
    )
radio_button_1.grid(row=0,column=0)

#~~ Radio-Schaltfläche-2
radio_button_2 = tk.Radiobutton(button_frame,
    bd = 1,
    bg = button_frame['bg'],
    highlightthickness = 0,
    activebackground   = button_frame['bg'],
    value = 1,
    variable = radio_button_state,
    command  = radio_button_call,
    )
radio_button_2.grid(row=1,column=0)

#~~ Eingabe-Feld-1
entry_1 = tk.Entry(button_frame,
    width = 20,
    bg   = 'white',
    fg   = 'blue',
    bd   = 1,
    highlightthickness = 0,
    disabledbackground = 'mistyrose',
    disabledforeground = 'red',
    )
entry_1.grid(row=1,column=1,columnspan=2)

#~~ Aktiviere die Radio-Schaltfläche-1
radio_button_1.invoke()

root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

@wuff:
das ist super, hab es einwenig um- und in mein Code eingebaut. Funzt super.

@pütone:
Das mit dem KeyPress-Event hab ich noch nicht ganz durchschaut.
Hab im Forum gestöbert abr nix direkt vergleichbares gefunden.
Wenn ich also ein Entry für den Pfad hab und gar nicht wissen will, ob der Pfod korrekt ist, sondern nur, ob was reingeschrieben wurde- soll ich dort den value- und den Variable-Wert setzen und über eine KeyPress()-abfrage verbinden?
Ich hab nur was über xxx.bind("<KeyPress>",yyy) gefunden und versteh nicht, wie man das hier verwenden könnte.

Sorry, blicks noch net so ganz... :roll: [/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du willst keine Links zu effbot etc., weil du es "schon durch" hast.
Dann hättest du die Geschichte mit den Events aber auch hinter dich gebracht.

Das solltest du dir nochmal gründlich zu Gemüte führen und nicht dein Programm aus verschiedenen codesnippets zusammenbasteln, die dir hier angeboten werden.

Was ich meinte, ist das:

Code: Alles auswählen

import Tkinter as tk

def set_buttonstate(event):
    state = tk.NORMAL if entry.get() else tk.DISABLED
    button.config(state=state)

root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
button = tk.Button(root,text="Do it!",state=tk.DISABLED)
button.pack()
entry.bind("<KeyRelease>",set_buttonstate)
root.mainloop()
Antworten