2016-12-23 1 views
0

Ich versuche, ein großes Etikett am oberen Rand des Fensters in der Mitte zu platzieren, dann 3 Optionsmenüs, die gleichmäßig darunter verteilt sind. Ich kann die Menüs nicht über das gesamte Fenster erstrecken. Ich bin mir nicht sicher, ob das, was ich falsch mache, istWie positioniert man Etiketten mit der Grid-Methode in Python Tkinter?

root.geometry("800x600") 

an der Unterseite. Alles ist gleichmäßig verteilt, aber es wird alles auf die linke Seite des Fensters geschoben, anstatt das Ganze zu füllen. Ich bin nicht zum nächsten Teil gekommen, wo ich verbindliche Funktionen sein werde, die Textabsätze unter jedem der Menüs anzeigen werden, weshalb ich das Fenster so groß haben möchte.

hier ist mein Code:

from tkinter import * 
from tkinter import messagebox 

root=Tk() 

topFrame=Frame(root) 
bottomFrame=Frame(root) 

#The first label 
lbl=Label(root,text="Pick a Decade",bg="turquoise",fg="hot pink",font= ("Times","40","bold italic")) 
lbl.grid(row=1,column=1) 

#Functions 
def fifties(s): 
    if s=="Intro": 
    lbl=Label(root,text="1950's intro",bg="turquoise") 
    lbl.grid(column=1) 
if s=="Political": 
    lbl=Label(root,text="1950's politcal",bg="turquoise") 
    lbl.grid(column=1) 
if s=="Economic": 
    lbl=Label(root,text="1950's economic",bg="turquoise") 
    lbl.grid(column=1) 
if s=="Social": 
    lbl=Label(root,text="1950's social",bg="turquoise") 
    lbl.grid(column=1) 
if s=="Technological": 
    lbl=Label(root,text="1950's technological",bg="turquoise") 
    lbl.grid(column=1) 
if s=="Aesthetic": 
    lbl=Label(root,text="1950's aesthetic",bg="turquoise") 
    lbl.grid(column=1) 

def sixties(s): 
if s=="Intro": 
    lbl=Label(root,text="1960's intro") 
    lbl.grid(column=1,row=3) 
if s=="Political": 
    lbl=Label(root,text="1960's politcal") 
    lbl.grid(column=1,row=3) 
if s=="Economic": 
    lbl=Label(root,text="1960's economic") 
    lbl.grid(column=1,row=3) 
if s=="Social": 
    lbl=Label(root,text="1960's social") 
    lbl.grid(column=1,row=3) 
if s=="Technological": 
    lbl=Label(root,text="1960's technological") 
    lbl.grid(column=1,row=3) 
if s=="Aesthetic": 
    lbl=Label(root,text="1960's aesthetic") 
    lbl.grid(column=1,row=3) 

def seventies(s): 
if s=="Intro": 
    lbl=Label(root,text="1970's intro") 
    lbl.grid(column=2,row=3) 
if s=="Political": 
    lbl=Label(root,text="1970's political") 
    lbl.grid(column=2,row=3) 
if s=="Economic": 
    lbl=Label(root,text="1970's economic") 
    lbl.grid(column=2,row=3) 
if s=="Social": 
    lbl=Label(root,text="1970's social") 
    lbl.grid(column=2,row=3) 
if s=="Technological": 
    lbl=Label(root,text="1970's technological") 
    lbl.grid(column=2,row=3) 
if s=="Aesthetic": 
    lbl=Label(root,text="1970's aesthetic") 
    lbl.grid(column=2,row=3) 

#Menus 
v=StringVar(root) 
v.set("1950's") 
a=OptionMenu(root,v,"Intro","Political","Economic","Social","Technological","Aesthetic",command=fifties) 
a.grid(column=0,row=2) 

v=StringVar(root) 
v.set("1960's") 
a=OptionMenu(root,v,"Intro","Political","Economic","Social","Technological","Aesthetic",command=sixties) 
a.grid(column=1,row=2) 

v=StringVar(root) 
v.set("1970's") 
a=OptionMenu(root,v,"Intro","Political","Economic","Social","Technological","Aesthetic",command=seventies) 
a.grid(column=2,row=2) 


#Root 
root.configure(background="turquoise") 
root.geometry("800x600") 
root.mainloop() 

Die Etiketten in den Funktionen, die „1950 soziale“ etc. etc. sein werden, die großen Ziffern sagen.

+0

[Das Tkinter Grid Geometry-Manager] (http://effbot.org/tkinterbook/grid.htm) – furas

+0

als Standard leere Zellen hat keine Größe. Und Widgets füllen nicht das volle Fenster: siehe [align in grid() und pack()] (https://github.com/furas/python-examples/tree/master/tkinter/align-grid-pack) – furas

+0

Ihr Eindruck scheint gebrochen zu sein. –

Antwort

0

Standardmäßig haben Zellen im Grid keine Größe. Sie können nur eine minimale Größe mit

root.columnconfigure(0, minsize=300) 
root.columnconfigure(1, minsize=300) 
root.columnconfigure(2, minsize=300) 

Um große Kopf zu erstellen setzen Sie 3-Zellen

lbl.grid(..., columnspan=3) 

Sie Widget auf Zellgröße mit verwenden können auch sticky='we'

Gitter verbinden kann (..., sticky = 'wir')

w = west/left, e = east/right

Arbeitsbeispiel:

import tkinter as tk 

# --- functions --- 

def fifties(selection): 
    data = { 
     "Intro": "1950's intro", 
     "Political": "1950's politcal", 
     "Economic": "1950's economic", 
     "Social": "1950's social", 
     "Technological": "1950's technological", 
     "Aesthetic": "1950's aesthetic", 
    } 

    if selection in data: 
     text_1950['text'] = data[selection] 
    else: 
     text_1950['text'] = "Unknow selection: " + selection 

def sixties(selection): 
    data = { 
     "Intro": "1960's intro", 
     "Political": "1960's politcal", 
     "Economic": "1960's economic", 
     "Social": "1960's social", 
     "Technological": "1960's technological", 
     "Aesthetic": "1960's aesthetic", 
    } 

    if selection in data: 
     text_1960['text'] = data[selection] 
    else: 
     text_1960['text'] = "Unknow selection: " + selection 

def seventies(selection): 
    data = { 
     "Intro": "1970's intro", 
     "Political": "1970's politcal", 
     "Economic": "1970's economic", 
     "Social": "1970's social", 
     "Technological": "1970's technological", 
     "Aesthetic": "1970's aesthetic", 
    } 

    if selection in data: 
     text_1970['text'] = data[selection] 
    else: 
     text_1970['text'] = "Unknow selection: " + selection 

# --- main --- 

# - init - 
root = tk.Tk() 
root.configure(bg="turquoise") 
root.geometry("900x600") 

# - set columns minimal size - 

root.columnconfigure(0, minsize=300) 
root.columnconfigure(1, minsize=300) 
root.columnconfigure(2, minsize=300) 

# - header - 

lbl = tk.Label(root, text="Pick a Decade", bg="turquoise", fg="hot pink", font=("Times", 40, "bold italic")) 
lbl.grid(column=0, row=0, columnspan=3, sticky='we') 

# - menus - 

options = ["Intro", "Political", "Economic", "Social", "Technological", "Aesthetic"] 

var = tk.StringVar(value="1950's") 
a = tk.OptionMenu(root, var, *options, command=fifties) 
a.grid(column=0, row=2, sticky='we') 

var = tk.StringVar(value="1960's") 
a = tk.OptionMenu(root, var, *options, command=sixties) 
a.grid(column=1, row=2, sticky='we') 

var = tk.StringVar(value="1970's") 
a = tk.OptionMenu(root, var, *options, command=seventies) 
a.grid(column=2, row=2, sticky='we') 

# - empty labels for text - 

text_1950 = tk.Label(root, bg="turquoise") 
text_1950.grid(column=0, row=3) 

text_1960 = tk.Label(root, bg="turquoise") 
text_1960.grid(column=1, row=3) 

text_1970 = tk.Label(root, bg="turquoise") 
text_1970.grid(column=2, row=3) 

# - start - 
root.mainloop() 

enter image description here

0

Der grid Geometrie-Manager muss wissen, was zu tun, wenn es mehr Platz als nötig, die Widgets angezeigt werden soll. Dazu wird das zusätzliche Leerzeichen relativ zum "Gewicht" jeder Zeile und Spalte zugewiesen. Wenn beispielsweise eine Spalte ein Gewicht von 3 und eine andere Spalte ein Gewicht von 1 hat, erhält die erste Spalte das Dreifache der Menge an zusätzlichem Speicherplatz wie die andere Spalte.

Standardmäßig haben Zeilen und Spalten ein Gewicht von Null. Das heißt, wenn es - wie in Ihrem Beispiel - zusätzlichen Platz gibt, bleibt es ungenutzt.

Die absolut einfachste Lösung für Ihr Problem besteht darin, jeder Spalte ein gleichwertiges Gewicht ungleich Null zu geben, damit zusätzlicher Platz gleichmäßig verteilt wird. Sie tun das mit der columnconfigure (oder grid_columnconfigure) Methode:

root.grid_columnconfigure(0, weight=1) 
root.grid_columnconfigure(1, weight=1) 
root.grid_columnconfigure(2, weight=1) 

Da Sie sagen, dass Sie das Label wollen alle drei Spalten zu überbrücken, müssen Sie grid sagen, dass, die Sie Null, indem das Etikett in Spalte tun können und ihm eine columnspan von 3 geben:

lbl.grid(row=1,column=0, columnspan=3) 
Verwandte Themen