2017-07-24 159 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