grid_remove() funzt net???

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

Mittwoch 25. Juni 2008, 14:30

schon wieder plagt mich ein komisches Phenomen:

Code: Alles auswählen

from Tkinter import*

root = Tk()
var1 = IntVar()

Row7 = Frame(root, width=600)
Row7.config(background="#CCCCCC")
Row7.grid(sticky=N+S)

def checkLabel1():
    checkFrame1 = Canvas(Row7, relief="groove", width=600, height=158, background="#CCCCCC")
    checkLabel1 = Label(Row7, text="ich bin eine Beschriftung", font=("Arial",10, "bold"), fg="#FFFFFF", bg="#990000")
    check=var1.get()
    print check
    if check == 1:
#        checkFrame1.grid(sticky=N, row=0, column=0)
        checkLabel1.grid(row=0, column=0, sticky=N+W+E, padx=5, pady=5)
        print"an"
    elif check == 0:
#            checkFrame1.grid_remove()
            checkLabel1.grid_remove()
            print"aus"

Checkbox1 = Checkbutton(root, text="ich bin ein checkbutton", variable=var1, bg="#CCCCCC", indicatoron=0, command=checkLabel1)
Checkbox1.grid(row=2, column=0, pady=2, padx=3, sticky=W)
root.mainloop()
wieso verschwindet das Frame und das Label nicht, wenn ich den Button wieder "aus" mache?

onvalue ist doch standartmässig 1 und offvalue 0, so wird es ja auch ausgegeben.
Die if/elif geht auch, weil ja das "print check" richtig funzt...

:roll: heut ist nicht mein Tag :cry:
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 25. Juni 2008, 15:39

Hallo,

hier die Lösung!!

Code: Alles auswählen

from Tkinter import*

root = Tk()
var1 = IntVar()

Row7 = Frame(root, width=600)
Row7.config(background="#CCCCCC")
Row7.grid(sticky=N+S)

def checkLabel1():
    Row7.grid()
    
    checkFrame1 = Canvas(Row7, relief="groove", width=600, height=158, background="#CCCCCC")
    checkLabel1 = Label(Row7, text="ich bin eine Beschriftung", font=("Arial",10, "bold"), fg="#FFFFFF", bg="#990000")
    check=var1.get()
    
    print check
    if check == 1:
#        checkFrame1.grid(sticky=N, row=0, column=0)
        checkLabel1.grid(row=0, column=0, sticky=N+W+E, padx=5, pady=5)
        print"an"
        
    elif check == 0:
#            checkFrame1.grid_remove()
            Row7.grid_forget()
            print"aus"
    

Checkbox1 = Checkbutton(root, text="ich bin ein checkbutton", variable=var1, bg="#CCCCCC", indicatoron=0, command=checkLabel1)
Checkbox1.grid(row=2, column=0, pady=2, padx=3, sticky=W)
root.mainloop() 
Den Rest darfst du selber herausfinden. :wink:

Gruss
pyStyler
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Mittwoch 25. Juni 2008, 17:04

Hallo Pü-Ton

Hier ist noch eine Lösung zum ausprobieren. Ich weiss nicht was deine Wünsche sind. Ein genauer Funktionbeschrieb würde das klären.

Code: Alles auswählen

#~~ Scriptname grid_remove.py Version-1.1 (wuf 25.062008)
#   Test auf Linux 10.0

from Tkinter import*

root = Tk()
var1 = IntVar()

Row7 = Frame(root,
    bg    = "#CCCCCC",
#    width = 600
    )
Row7.grid(row=0,column=0) #,sticky=N+S)

def checkLabel1():
    """Status des Checkbuttons wechselt"""

    check=var1.get()

    if check == 1:
        print"an"
        #~~ Mache Frame Row7 sichtbar
        Row7.grid_configure(row7_grid_info)
        #~~ Mache Frame sichtbar
        checkFrame1.grid_configure(check_frame1_grid_info)
        #~~ Mache Label sichtbar
        checkLabel1.grid_configure(check_label1_grid_info)

    elif check == 0:
        print"aus"
        #~~ Mache Frame unsichtbar
        checkFrame1.grid_forget()
        #~~ Mache Label unsichtbar
        checkLabel1.grid_forget()
        #~~ Mache Frame Row7 unsichtbar
        Row7.grid_forget()

#~~ Erstellt den Checkbutton
Checkbox1 = Checkbutton(root,
    bg   = "#CCCCCC",
    text = "Ich bin ein checkbutton",
    padx = 5,
    variable = var1,
    command  = checkLabel1,
    indicatoron = 0,
    )
Checkbox1.grid(row=1, column=0, pady=2, padx=3, sticky=W)

#~~ Erstellt die Canvas
checkFrame1 = Canvas(Row7,
    relief = "groove",
    width  = 600,
    height = 158,
    background ="yellow",
#    background ="#CCCCCC"
    )
checkFrame1.grid(row=0, column=0, sticky=N+W+E+S)

#~~ Gibt dem checkFrame1 eine Namen
checkFrame1.create_text(
    10,10,
    text   = "Mein Name ist 'checkFrame1'",
    font   = ("Arial", 10,"bold"),
    anchor = 'nw'
    )

#~~ Erstelle das Label
checkLabel1 = Label(Row7,
    text = "Ich bin eine Beschriftung",
    font = ("Arial", 10,"bold"),
    fg   = "#FFFFFF",
    bg   = "#990000"
    )
checkLabel1.grid(row=1, column=0, sticky=N+W+E, padx=5, pady=5)

#~~ Sichere die Grid-Konfiguration des Main-Frames Row7
row7_grid_info = Row7.grid_info()

#~~ Sichert die Grid-Konfiguration des Frames
check_frame1_grid_info = checkFrame1.grid_info()

#~~ Sichert die Grid-Konfiguration des Labels
check_label1_grid_info = checkLabel1.grid_info()

#~~ Mache Frame unsichtbar
checkFrame1.grid_forget()

#~~ Mache Label unsichtbar
checkLabel1.grid_forget()

root.mainloop()

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 26. Juni 2008, 08:00

pyStyler hat geschrieben:Hallo,

hier die Lösung!!
Hallo pyStyler,

es wäre evtl. auch hilfreich zu erwähnen, was Du an dem Code verändert hast, damit er das Gewünschte macht.
Es sieht auf den ersten Blick so aus, als hättest Du grid_remove durch grid_forget ersetzt, was aber dazu führt, dass die grid-Informationen verworfen werden. Der eigentliche Vorteil am grid_remove ist es aber, dass die Informationen erhalten bleiben, so dass das Widget beim nächsten Aufruf von grid() (ohne Parameter) wieder dort und so erscheint, wie es verschwand. Hier mal mein Vorschlag dazu:

Code: Alles auswählen

from Tkinter import *

root = Tk()
var1 = IntVar()

row7 = Frame(root, width=600)
row7.config(background="#CCCCCC")
row7.grid(row=0, column=0, sticky=N+S)

label1 = Label(row7, text="ich bin eine Beschriftung", font=("Arial",10, "bold"), fg="#FFFFFF", bg="#990000")
label1.grid(row=0, column=0, sticky=N+W+E, padx=5, pady=5)

checkbox1 = Checkbutton(root, text="ich bin ein checkbutton", variable=var1, bg="#CCCCCC", indicatoron=0)
checkbox1.grid(row=2, column=0, pady=2, padx=3, sticky=W)

def check_label1():
    check=var1.get()
    print check
    if check == 1:
        row7.grid()
        print"an"
    elif check == 0:
        row7.grid_remove()
        print"aus"

checkbox1.config(command=check_label1)
check_label1()   # Zeige an, was dem Status entspricht
root.mainloop()
@Pü-Ton: warum hast Du denn das Label genauso benannt wie die Funktion (checkLabel1)? Das kann Verwirrung stiften, weshalb man sowas vermeiden sollte.

Auch von mir der gut gemeinte Rat: schau Dir möglichst frühzeitig die PEP-8 an, insbesondere die Python Namenskonventionen. Es hilft sehr beim Verständnis der Codebeispiele hier im Forum und den Anderen, die Deinen Code nachvollziehen wollen.

Ich hoffe, dass der Code bei der Lösung Deines Problems hilft.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Donnerstag 26. Juni 2008, 09:25

Hey Leute, vieeeeelen Dank. :lol:

das mit dem pep8 mus ich mir langsam echt mal angewöhnen...
:roll:
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Donnerstag 26. Juni 2008, 10:46

Hallo Pü-Ton

Habe meine Lösung gezielt auf die Grid-Methode widget.grid_remove() angepasst. Scheinbar existiert bei den Layoutmanagern 'Place' und 'Pack' die Methode ..._remove() nicht. Darum brauchte ich diese Methode bisher nicht. Schon wieder etwas gelernt. Du siehst jeder Beitrag in diesem Form pflanzt neues Wissen.

Hier noch mein frisiertes Code-Snippet:

Code: Alles auswählen

#~~ Scriptname grid_remove_03.py Version-1.2 (wuf 26.06.2008)
#   Test auf Linux 10.0

from Tkinter import*

root = Tk()
root.title('Grid-Remove')

var1 = IntVar()

Row7 = Frame(root,
    bg    = "#CCCCCC",
#    width = 600
    )
Row7.grid(row=0,column=0) #,sticky=N+S)

def check_label1():
    """Status des Checkbuttons wechselt"""

    check=var1.get()

    if check == 1:
        print"an"
        #~~ Mache Frame Row7 sichtbar
        Row7.grid()
        #~~ Mache Frame sichtbar
        checkFrame1.grid()
        #~~ Mache Label sichtbar
        checkLabel1.grid()

    elif check == 0:
        print"aus"
        #~~ Mache Frame unsichtbar
        checkFrame1.grid_remove()
        #~~ Mache Label unsichtbar
        checkLabel1.grid_remove()
        #~~ Mache Frame Row7 unsichtbar
        Row7.grid_remove()

#~~ Erstellt den Checkbutton
Checkbox1 = Checkbutton(root,
    bg   = "#CCCCCC",
    text = "Ich bin ein checkbutton",
    padx = 5,
    variable = var1,
    command  = check_label1,
    indicatoron = 0,
    )
Checkbox1.grid(row=1, column=0, pady=2, padx=3, sticky=W)

#~~ Erstellt die Canvas
checkFrame1 = Canvas(Row7,
    relief = "groove",
    width  = 600,
    height = 158,
    background ="yellow",
#    background ="#CCCCCC"
    )
checkFrame1.grid(row=0, column=0, sticky=N+W+E+S)

#~~ Gibt dem checkFrame1 eine Namen
checkFrame1.create_text(
    10,10,
    text   = "Mein Name ist 'checkFrame1' (Canvas)",
    font   = ("Arial", 10,"bold"),
    anchor = 'nw'
    )

#~~ Erstelle das Label
checkLabel1 = Label(Row7,
    text = "Ich bin eine Beschriftung",
    font = ("Arial", 10,"bold"),
    fg   = "#FFFFFF",
    bg   = "#990000"
    )
checkLabel1.grid(row=1, column=0, sticky=N+W+E, padx=5, pady=5)

#~~ Funktionsname 'checkLabel1' ersetzt durch 'check_label1'
check_label1()

root.mainloop()

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

Donnerstag 26. Juni 2008, 11:16

Hallo wuf,

mit dem packer gibts nur widget.pack_forget() während es bei grider
widget.grid_forget() und widget.grid_remove() gibt.
Antworten