2017-07-31 36 views
1

我有一个tk窗口有3个框架,左侧的工作方式类似于一个树形结构,标签将被添加和删除.grid()grid_remove(),右边框架将显示有关信息这些物品,和一个底部框架,将举行按钮。如果我在左框架(lframe)上展开过多物品,它会将底框架(bframe)推出视野。当它到达窗口的边缘时,我宁愿让底部框架停下来,并使用lframe的滚动条来查看lframe的项目。停止tkinter框架被推下屏幕

下面是我看到的一个简单例子。当你点击按钮时,更多的标签小部件将被创建,并且会将bframe推出。

from tkinter import * 

main = Tk() 

canvas = Canvas(main) 
canvas.grid(row=0, column=0) 
canvas.configure(scrollregion=canvas.bbox("all")) 
lframe = Frame(canvas) 
lframe.grid(row=0, column=1) 


sbar = Scrollbar(canvas) 
sbar.config(command=canvas.yview) 
canvas.config(yscrollcommand=sbar.set) 
sbar.grid(row=0, column=0, sticky=NSEW) 

rframe = Frame(main) 
rframe.grid(row=0, column=1, sticky=N) 

bframe = Frame(main) 
bframe.grid(row=1, column=1) 


cnt = 1 
def addmore(): 
    global cnt 

    test = Label(lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n') 
    test.grid(row=cnt, column=0) 
    cnt += 1 
    lframe.update() 


llbl = Label(lframe, text='this \nis \nthe \nLEFT \nframe') 
llbl.grid() 

rlbl = Label(rframe, text='this is the RIGHT frame') 
rlbl.grid() 
btn = Button(rframe, text='click me', command=addmore) 
btn.grid(row=1, column=0, sticky=N) 
blbl = Label(bframe, text='this is the BOTTOM frame', bg="yellow") 
blbl.grid(row=0) 


main.mainloop() 

问题1: 我怎样才能阻止推离屏幕上的B帧?我希望它在达到main的底部时停止,并且lframe中的标签开始推出bframe后面的视图。然后用户将使用滚动条查看lframe中的其他项目。

问题2: 我不知道我的滚动条是否配置正确,直到我可以让lframe停止推开屏幕。如果它没有正确设置,我需要改变什么?

+0

解决调整大小问题的方法可能是使用列和行权重。用'rowconfigure()'和'columnconfigure()'。我已经解决了调整大小的问题,但由于某种原因,我无法使滚动条正常工作。我会一直搞乱它,直到我弄明白为什么。 –

+0

@SierraMountainTech根据文件重量只是处理它的增长速度。将它添加到上面的例子并没有改变任何东西。 – sidnical

+0

它的确如此,但是如果您添加一个零权重来表示底部框架的最后一行,然后在主窗口中为顶部框架的顶部行添加1的权重,那么底部框架将永远不会被推出。 –

回答

1

下面是一个如何在主框架中使用重量设置此滚动画布的示例。它并不完美,但应该足以提供帮助。

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self): 

     tk.Frame.__init__(self) 

     self.canvas = tk.Canvas(self, borderwidth=0, width = 50, height = 100) 
     self.lframe = tk.Frame(self.canvas, width=10) 
     self.sbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.sbar.set) 

     self.sbar.grid(row=0, column=0, rowspan=2, sticky="nsw") 
     self.canvas.grid(row=0, column=1, rowspan=2, sticky="nsew") 
     self.canvas.create_window((2,2), window=self.lframe, anchor="ne", 
            tags="self.lframe") 

     self.lframe.bind("<Configure>", self.onFrameConfigure) 
     self.rframe = tk.Frame(self) 
     self.rframe.grid(row=0, column=2, sticky="n") 

     self.bframe = tk.Frame(self) 
     self.bframe.grid(row=1, column=2) 

     llbl = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe') 
     llbl.grid(row = 0, column = 0) 

     rlbl = tk.Label(self.rframe, text='this is the RIGHT frame') 
     rlbl.grid(row = 0, column = 0) 
     btn = tk.Button(self.rframe, text='click me', command=self.addmore) 
     btn.grid(row=1, column=0, sticky="n") 
     blbl = tk.Label(self.bframe, text='this is the BOTTOM frame', bg="yellow") 
     blbl.grid(row = 2, column = 0, sticky = "s") 

     self.bframe.rowconfigure(1, weight = 1) 
     self.bframe.rowconfigure(2, weight = 0) 
     self.rowconfigure(0, weight = 1) 
     self.rowconfigure(1, weight = 1) 
     self.columnconfigure(0, weight = 0) 
     self.columnconfigure(1, weight = 1) 
     self.columnconfigure(2, weight = 0) 

     self.cnt = 1 

    def addmore(self): 
     test = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n') 
     test.grid(row=self.cnt, column=0) 
     self.cnt += 1 

    def onFrameConfigure(self, event): 
     '''Reset the scroll region to encompass the inner frame''' 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

if __name__ == "__main__": 
    root=tk.Tk() 
    Example().grid(row=0, column=0) 
    root.mainloop() 
+0

这几乎是什么后im。滚动条有效,但lframe不允许展开。这迫使我为lframe设置一个静态大小,并且可能无法在所有监视器上运行。我会稍微玩一下,看看我能否实现它。 – sidnical

+0

@sidnical:你需要自动扩展然后停在某个特定点吗?您可以设置框架的最大尺寸。 –

+0

你在这个类中的行和列配置似乎没有什么区别。我在__init__的末尾删除了配置部分,它似乎没有改变UI的工作方式。当您单击按钮添加更多标签时,此示例是否展开lframe? – sidnical