2017-07-24 76 views
0

感谢您花时间看看这个。我一直在为此奋斗了近一个星期,这让我疯狂。Python Tkinter:Paned窗口不能顶到顶部

我有一个水平的Paned窗口,应该从我的工具栏的底部延伸到窗口的底部,但它只粘在根窗口的底部。最终,我想在左侧窗格中有一个Treeview小部件,并在右侧窗格中有缩略图。

任何人都可以帮助我获得Paned窗口来粘贴NSEW吗?我需要把它放在另一个框架内吗?

我使用Python 2.7在Windows 7(这不是我的整个程序,只是一个样本来证明这个问题。)

#!/usr/bin/env python 
# coding=utf-8 

from Tkinter import * 
from ttk import * 

class MainWindow: 

    def null(self): 
     pass 

    def __init__(self): 
     self.root = Tk() 
     self.root.geometry("700x300") 
     self.root.resizable(width=TRUE, height=TRUE) 
     self.root.rowconfigure(0, weight=1) 
     self.root.columnconfigure(0, weight=1) 

     self.menubar = Menu(self.root) 
     File_menu = Menu(self.menubar, tearoff=0) 
     self.menubar.add_cascade(label="Pandoras Box", menu=File_menu) 
     File_menu.add_command(label="Black Hole", command=self.null) 
     self.root.config(menu=self.menubar) 

     self.toolbar = Frame(self.root, relief=RAISED) 
     self.toolbar.grid(row=0, column=0, sticky='NEW') 
     self.toolbar.grid_columnconfigure(0, weight=1) 
     self.toolbar.rowconfigure(0, weight=1) 

     dummy = Button(self.toolbar, text="Tool Button") 
     dummy.grid(row=0, column=0, sticky='EW') 
     Find = Label(self.toolbar, text="Search") 
     Search = Entry(self.toolbar) 
     Find.grid(row=0, column=5, sticky='E', padx=6) 
     Search.grid(row=0, column=6, sticky='E', padx=8) 

     self.info_column = Frame(self.root, relief=RAISED, width=100) 
     self.info_column.grid(row=0, column=5, rowspan=3, sticky='NSW') 
     self.info_column.grid_rowconfigure(0, weight=1) 
     self.info_column.grid_columnconfigure(0, weight=1) 

     self.rootpane = PanedWindow(self.root, orient=HORIZONTAL) 
     self.rootpane.grid(row=1, column=0, sticky='NS') 
     self.rootpane.grid_rowconfigure(0, weight=1) 
     self.rootpane.grid_columnconfigure(0, weight=1) 

     self.leftpane = Frame(self.rootpane, relief=RAISED) 
     self.leftpane.grid(row=0, column=0, sticky='NSEW') 

     self.rightpane = Frame(self.rootpane, relief=RAISED) 
     self.rightpane.grid(row=0, column=0, sticky='NSEW') 

     ''' THESE BUTTONS ARE SUPPOSED TO BE INSIDE PANED WINDOW STUCK TO THE TOP!''' 
     but_left = Button(self.leftpane, text="SHOULD BE IN LEFT PANE UNDER TOOLBAR FRAME") 
     but_left.grid(row=0, column=0, sticky='NEW') 

     but_right = Button(self.rightpane, text="SHOULD BE IN RIGHT PANE UNDER TOOLBAR FRAME") 
     but_right.grid(row=0, column=0, sticky='NEW') 

     self.rootpane.add(self.leftpane) 
     self.rootpane.add(self.rightpane) 

     self.SbarMesg = StringVar() 
     self.label = Label(self.root, textvariable=self.SbarMesg, font=('arial', 8, 'normal')) 
     self.SbarMesg.set('Status Bar:') 
     self.label.grid(row=3, column=0, columnspan=6, sticky='SEW') 
     self.label.grid_rowconfigure(0, weight=1) 
     self.label.grid_columnconfigure(0, weight=1) 

     self.root.mainloop() 


a = MainWindow() 

回答

1

简短的回答:你的看空按钮和工具栏架是因为你允许的,而不是包含PanedWindow ...要得到你想要的东西的行包含工具栏行调整,替换:

self.root.rowconfigure(0, weight=1) 

self.root.rowconfigure(1, weight=1) 

其他意见

  • 尝试avoid wildcard imports。在这种情况下,它很难区分tkttk小工具
  • 要允许调整使用grid()对齐的小工具的大小,必须在小工具的父级调用.rowconfigure(..., weight=x)而不是小工具本身。
  • 背景颜色对于调试tkinter中的对齐问题非常有用。

代码:

import Tkinter as tk 
import ttk 

class MainWindow: 

    def __init__(self): 
     self.root = tk.Tk() 
     self.root.geometry("700x300") 
     self.root.resizable(width=tk.TRUE, height=tk.TRUE) 
     self.root.rowconfigure(1, weight=1) 
     self.root.columnconfigure(0, weight=1) 

     self.toolbar = tk.Frame(self.root, relief=tk.RAISED, bg="yellow") 
     self.toolbar.grid(row=0, column=0, sticky='NEW') 
     self.toolbar.columnconfigure(0, weight=1) 

     dummy = ttk.Button(self.toolbar, text="Tool Button") 
     dummy.grid(row=0, column=0, sticky='EW') 
     Find = tk.Label(self.toolbar, text="Search") 
     Search = ttk.Entry(self.toolbar) 
     Find.grid(row=0, column=5, sticky='E', padx=6) 
     Search.grid(row=0, column=6, sticky='E', padx=8) 

     self.info_column = tk.Frame(self.root, relief=tk.RAISED, width=100, bg="orange") 
     self.info_column.grid(row=0, column=5, rowspan=2, sticky='NSW') 

     self.rootpane = tk.PanedWindow(self.root, orient=tk.HORIZONTAL, bg="blue") 
     self.rootpane.grid(row=1, column=0, sticky='NSEW') 

     self.leftpane = tk.Frame(self.rootpane, bg="pink") 
     self.rootpane.add(self.leftpane) 

     self.rightpane = tk.Frame(self.rootpane, bg="red") 
     self.rootpane.add(self.rightpane) 

     ''' THESE BUTTONS ARE SUPPOSED TO BE INSIDE PANED WINDOW STUCK TO THE TOP!''' 
     but_left = ttk.Button(self.leftpane, text="SHOULD BE IN LEFT PANE UNDER TOOLBAR FRAME") 
     but_left.grid(row=0, column=0, sticky='NEW') 

     but_right = ttk.Button(self.rightpane, text="SHOULD BE IN RIGHT PANE UNDER TOOLBAR FRAME") 
     but_right.grid(row=0, column=0, sticky='NEW') 

     self.label = tk.Label(self.root, text="Status:", anchor="w") 
     self.label.grid(row=3, column=0, columnspan=6, sticky='SEW') 

     self.root.mainloop() 

a = MainWindow() 
+1

非常感谢您抽出宝贵时间来帮助我,我真的很感激。我注意到,当我注释根行窗口的行配置时,事情会发生在顶部,但是另一个方向则是一个问题。所以我把行配置到处看看它是否工作。另外你的关于背景颜色的提示是一个好主意。谢谢 – sdproto

+0

只是一个快速跟进问题。你在rowconfigure中改变的那个“1”是什么意思?增加它有什么作用? (除了解决我的问题)。 – sdproto

+0

不客气。 “1”是行的索引(http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-config.html),您希望将其拉伸(第二行) 。以前,使用“0”使第一行可拉伸。 – Josselin