2013-07-11 186 views
6

我正在製作我的第一個GUI應用程序,並且遇到了一個愚蠢的問題。調整主窗口的大小不會調整其內容大小並留下空白區域。我讀過TKDocs,他們只是說你應該使用粘性和列/行權重屬性,但我並不真正瞭解它們是如何工作的。 這裏是我的代碼(僅部分覆蓋部件,如果你認爲問題不在這裏,我會發布它的其餘部分):調整窗口大小不會調整tkinter中的內容大小

from tkinter import * 
from tkinter import ttk 

root = Tk() 

mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

player1 = StringVar() 
player2 = StringVar() 
player1.set('Player 1') 
player2.set('Player 1') 
timer=StringVar() 
running=BooleanVar() 
running.set(0) 
settimer = ttk.Entry(mainframe, width=7, textvariable=timer) 
settimer.grid(column=2, row=1, sticky=(N, S)) 
ttk.Button(mainframe, text="Start", command=start).grid(column=2, row=2, sticky=(N, S)) 

ttk.Label(mainframe, textvariable=player1, font=TimeFont).grid(column=1, row=3, sticky=(W, S)) 
ttk.Label(mainframe, textvariable=player2, font=TimeFont).grid(column=3, row=3, sticky=(E, S)) 

for child in mainframe.winfo_children(): 
    child.grid_configure(padx=80, pady=10) 

root.mainloop() 

感謝您的時間!

+0

每[GCB(http://stackoverflow.com/users/183132),你可能會發現[製作根窗口調整大小](http://infohost.nmt.edu/tcc/help/pubs /tkinter/web/root-resize.html)是一個有用的參考。 –

回答

8

也許這會幫助你在正確的方向。確保在每個級別配置列/行權重。

import tkinter.ttk 
from tkinter.constants import * 

class Application(tkinter.ttk.Frame): 

    @classmethod 
    def main(cls): 
     tkinter.NoDefaultRoot() 
     root = tkinter.Tk() 
     app = cls(root) 
     app.grid(sticky=NSEW) 
     root.grid_columnconfigure(0, weight=1) 
     root.grid_rowconfigure(0, weight=1) 
     root.resizable(True, False) 
     root.mainloop() 

    def __init__(self, root): 
     super().__init__(root) 
     self.create_variables() 
     self.create_widgets() 
     self.grid_widgets() 
     self.grid_columnconfigure(0, weight=1) 

    def create_variables(self): 
     self.player1 = tkinter.StringVar(self, 'Player 1') 
     self.player2 = tkinter.StringVar(self, 'Player 2') 
     self.timer = tkinter.StringVar(self) 
     self.running = tkinter.BooleanVar(self) 

    def create_widgets(self): 
     self.set_timer = tkinter.ttk.Entry(self, textvariable=self.timer) 
     self.start = tkinter.ttk.Button(self, text='Start', command=self.start) 
     self.display1 = tkinter.ttk.Label(self, textvariable=self.player1) 
     self.display2 = tkinter.ttk.Label(self, textvariable=self.player2) 

    def grid_widgets(self): 
     options = dict(sticky=NSEW, padx=3, pady=4) 
     self.set_timer.grid(column=0, row=0, **options) 
     self.start.grid(column=0, row=1, **options) 
     self.display1.grid(column=0, row=2, **options) 
     self.display2.grid(column=0, row=3, **options) 

    def start(self): 
     timer = self.timer.get() 
     self.player1.set(timer) 
     self.player2.set(timer) 

if __name__ == '__main__': 
    Application.main() 
+0

好的,謝謝,我有點希望我可以避免使用類,他們嚇倒我。但是,我猜所有的東西都是第一次... – Dunno

+1

@Dunno:如果您需要使用類的'tkinter'應用程序的示例,請告訴我。當我第一次開始使用GUI庫時,我的代碼與您的代碼類似。現在每當這樣的代碼引起我的注意時,我的第一個想法就是代碼需要被完全重寫。 –

+0

感謝您的提議,但互聯網上充滿了這樣的例子,我不想花太多時間和實踐我的谷歌福來代替;) – Dunno