2016-07-20 15 views
0

Ich habe Kommentare an verschiedenen Stellen, an denen ich versucht habe, die Methoden columnconfigure oder rowconfigure zu verwenden, um die Größe der Fenster zu ändern, aber nichts scheint zu funktionieren. Ich kann auch Hauptschleife() herausnehmen und mein Programm läuft genau gleich. Das führt mich zu der Annahme, dass ich vielleicht nicht richtig mit dem Hauptkabel anrufe. Die Methoden dienen hauptsächlich der Organisation, und ich weiß, dass sie im Moment keine wiederverwendbaren Methoden sind. Ich hatte vor, das irgendwann zu korrigieren, aber das ist nicht der Zweck dieses Posts.Wie erzwinge ich die Größe dieser TTK-Apps, wenn ich die Größe des Fensters ändere?

#!/usr/bin/python 

from tkinter import * 
from tkinter import ttk 
import webbrowser 
from dictionary import * 

class AI(): 

    def __init__(self): 
     self.urls = dictionary.get() 
     self.makeMainframe() 
     self.makeLabels() 
     self.makeDropDown() 
     self.makeButton() 
     self.makeEntry() 
     for child in self.mainframe.winfo_children(): 
      child.grid_configure(padx=2, pady=2) 
      #child.columnconfigure(index='all',weight=1) 
      #child.rowconfigure(index='all',weight=1) 

    def openMenu(self): 
     webbrowser.open(self.urls[self.lunchVar.get()]) 
     print(self.urls[self.lunchVar.get()]) 

    def saveChoice(self, event): 
     print(self.foodVar.get()) 

    def makeMainframe(self): 
     self.mainframe = ttk.Frame(padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N,W,E,S)) 
     #self.mainframe.columnconfigure('all', weight=1) 
     #self.mainframe.rowconfigure(index='all', weight=1) 

    def makeDropDown(self): 
     self.lunchVar = StringVar() 

     self.lunchChoice = ttk.Combobox(self.mainframe, textvariable=self.lunchVar, state='readonly') 
     self.lunchChoice['values'] = list(self.urls.keys()) 
     self.lunchChoice.grid(column=2, row=1, sticky=(W, E)) 

    def makeLabels(self): 
     ttk.Label(self.mainframe, text="Today's lunch is from...").grid(column=1, row=1, sticky=(E,W)) 
     ttk.Label(self.mainframe, text="Click here for a menu -->").grid(column=1, row=2, sticky=(E,W)) 
     ttk.Label(self.mainframe, text="What will you be having?").grid(column=1, row=3, sticky=(E,W)) 

    def makeButton(self): 
     self.menu = ttk.Button(self.mainframe, textvariable=self.lunchVar, command=self.openMenu) 
     self.menu.grid(column=2, row=2, sticky=(W, E)) 

    def makeEntry(self): 
     self.foodVar = StringVar() 
     self.foodChoice = ttk.Entry(self.mainframe, textvariable=self.foodVar) 
     self.foodChoice.grid(column=2, row=3, sticky=(E,W)) 
     self.foodChoice.bind("<Return>", self.saveChoice) 
     #self.foodChoice.columnconfigure(index='all', weight=1) 

AI=AI() 
mainloop() 
+1

einige Ihrer Eindruck ist gebrochen –

Antwort

0

Sie legen self.mainframe im Root-Fenster, aber man kann nie ein Gewicht alle Zeilen und Spalten im Hauptfenster geben. Sie erstellen auch niemals explizit ein Stammfenster, obwohl dies nicht zu dem Problem beiträgt. Außerdem ist "all" keine gültige Zeile oder Spalte.

Der erste Schritt besteht darin, Ihren Hauptrahmen zu vergrößern, dann können Sie sich auf den Inhalt innerhalb des Rahmens konzentrieren.

def makeMainframe(self): 
    ... 
    self.mainframe._root().columnconfigure(0, weight=1) 
    self.mainframe._root().rowconfigure(index=0, weight=1) 

Hinweis: in dem Fall, in dem Sie einen einzelnen Frame innerhalb einer anderen Widget (wie das Root-Fenster) setzen sind, pack ist wohl eine bessere Wahl, weil Sie müssen mich nicht daran erinnern, Gewicht zu geben, die Zeilen und Spalten. Sie können diese ersetzen:

self.mainframe.grid(column=0, row=0, sticky=(N,W,E,S)) 
self.mainframe._root().columnconfigure(0, weight=1) 
self.mainframe._root().rowconfigure(index=0, weight=1) 

... mit diesem:

self.mainframe.pack(fill="both", expand=True) 

Unter der Annahme, dass Sie die Eingabe-Widgets wollen den Raum horizontal erweitern zu füllen, müssen Sie das gleiche mit mainframe tun:

def makeMainframe(self): 
    ... 
    self.mainframe.grid_columnconfigure(2, weight=1) 
+0

So dass auf jeden Fall funktioniert. Kannst du mir erklären, was pack() macht und was du damit meinst, ich erstelle niemals explizit ein Root-Fenster? Ist das etwas, was ich tun sollte? Danke vielmals! – JustAGuy

+0

@JustAGuy: http://stackoverflow.com/a/3968033/7432. Alle Tkinter GUIs benötigen ein Root-Fenster. Das Root-Fenster ist eine Instanz von 'Tk()', die implizit erstellt wird, wenn Sie es nicht explizit erstellen. PEP8 sagt explizit ist besser als implizit. http://effbot.org/tkinterbook/tkinter-hello-tkinter.htm –

+0

Also würde ich nur etwas wie "root = Tk()" über meine Klasse legen müssen? Und wo müsste das im Rest des Codes implementiert/verwendet werden, wenn irgendwo? Nochmals vielen Dank, tut mir leid, dass ich so viel gefragt habe – JustAGuy

Verwandte Themen