2016-07-22 38 views
2

我为我的GUI创建了3个帧(页),并添加了一些小部件来显示我的GUI的基本框架。将小部件添加到第三页导致帧调整大小

我已经使用.grid_propagate(0)方法来阻止我的框架根据它们中的小部件来调整大小。

请参阅以下代码:当我加入小工具win3

from Tkinter import * 
# from tkFileDialog import askopenfilename 
# from Function_Sheet import * 
# from time import sleep 
# import ttk, ttkcalendar, tkSimpleDialog, csv, pyodbc, threading 
# from Queue import Queue 
# import os 
# cwd = os.getcwd() 


class CA_GUI: 

    def __init__(self, master): 
     ### Configure ### 
     win_colour = '#D2B48C' 
     master.title('CA 2.0'), master.geometry('278x289'), master.configure(background='#EEE5DE') 
     win1, win2, win3 = Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270) 

     ### Grid Frames ### 
     for window in [win1,win2,win3]: 
      window.grid(column=0, row=0, sticky='news', pady=10, padx=10) 
      window.grid_propagate(0) 

     ### Window 1 ### 
     self.win1_label1 = Label(win1, text = 'This is page 1!') 
     self.win1_label1.pack(fill = X, side = TOP) 

     self.win1_button1 = Button(win1, text = 'Close', command = master.quit) 
     self.win1_button1.pack(fill = X, side = BOTTOM) 

     self.win1_button2 = Button(win1, text = 'Page 2', command = lambda:self.next_page(win2)) 
     self.win1_button2.pack(fill = X, side = BOTTOM) 

     ### Window 2 ### 
     self.win2_label1 = Label(win2, text = 'This is page 2!') 
     self.win2_label1.pack(fill = X, side = TOP) 

     self.win2_button1 = Button(win2, text = 'Close', command = master.quit) 
     self.win2_button1.pack(fill = X, side = BOTTOM) 

     self.win2_button2 = Button(win2, text = 'Page 3', command = lambda:self.next_page(win3)) 
     self.win2_button2.pack(fill = X, side = BOTTOM) 

     ### Window 3 ### 
     self.win3_label1 = Label(win3, text = 'This is page 3!') 
     self.win3_label1.pack(fill = X, side = TOP) 

     win1.tkraise() 

    def next_page(self, window): 
     window.tkraise() 

root = Tk() 
b = CA_GUI(root) 
root.mainloop() 

的问题就来了。如果我注释掉与win3有关的代码,所有帧都保持其指定的大小,并且一切看起来不错。但是,即使是向win3添加一个简单的标签小部件,框架大小似乎也会适应其小部件的大小。 - 这不是我想要的!

P.S.

这个问题似乎并不是win3的独占作为注释掉另一个框架小部件解决了调整大小的问题。

任何反馈将不胜感激!

+0

注意:'grid_propagate(0)'不会有任何影响,如果你使用'pack'把小部件放在框架中。如果你使用'pack',你必须使用'pack_propagate'。 –

回答

1

我建议不要关闭几何传播。这几乎总是错误的选择。 Tkinter在高效布置小部件方面做得非常出色。让框架缩小(或增大)以适应内容,并使用几何管理器使框架适合分配给它的空间。

此代码中的问题是,您不允许网格将所有空间分配给帧。你需要至少给出一行和一列“权重”,这样网格才会为该行和列分配额外的空间,强制帧填充空间而不是缩小。

更改代码的一个部分,看起来像这样:

### Grid Frames ### 
master.grid_rowconfigure(0,weight=1) 
master.grid_columnconfigure(0,weight=1) 

for window in [win1,win2,win3]: 
    window.grid(column=0, row=0, sticky='news', pady=10, padx=10) 

这一切工作,因为你给了一个明确的大小到主窗口。从某种意义上说,为窗口设置一个固定的大小将关闭基于其直接子窗口自动调整窗口大小的功能。随着重新调整大小和正确使用网格选项,内部框架将填满窗口。

当然,如果你把小部件放得太大而不适合,它们会被切断。这是您使用明确大小而不是让tkinter增长或缩小以适应付出的代价。

+0

谢谢Brian。你的回答很好地解释了一切,并且理清了我所遇到的问题。亲切的问候,卢克。 –

0

在您的三个窗口中,您正在打包小部件,而不是盯着它们。因此,所有你需要做的是改变这一行:

window.grid_propagate(0) 

到:

window.pack_propagate(0) 

这样做之后,你会得到你所期望的:

enter image description here

+0

感谢您的输入。但是,如果我使用包装,所有三个窗口都垂直放置,并且都可以直接看到。这不是我需要不幸的! –

+0

不客气。每次我在上面修改后运行程序时都会看到一个窗口,如您从截图中看到的那样。 –

+0

我可以看到! :)我会张贴我自己的截图,但无法在评论中! –