Tkinter - Frame Scrolling into Another Frame?
我有一个问题,在网格上有两个框架,一个在顶部,一个在底部。两者都有一个画布在框架中。在底部的画布中,我有一个滚动条。唯一的问题是,当我向下滚动时,画布(以及框架)的内容会滚动到顶部框架中,这显然不太理想。
我试图限制每一个的宽度和高度,但没有用,我想知道是否有什么可以让内容"消失"在框架内,而不是只留下自己的框架。任何在网络上滚动的内容都会这样做,所以必须有一种方法。
这是我的代码;"测试"是顶部画布,"测试画布"是在底部框架中创建的底部画布。如您所见,"testcanvas"滚动到"test"。我试过阅读家教网站、effbot和stackoverflow,但我还是搞不清楚。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #!/usr/bin/python from struct import * import array import tkinter from tkinter import * from tkinter import ttk root = Tk() frame = Frame() frame.pack() root.minsize(width=230, height=70) root.maxsize(width=1070, height=500) IDlabel = ttk.Label(frame, text="Enter ID:") IDlabel.pack() IDentry = ttk.Entry(frame) IDentry.pack() def close(): root.quit() def submit(event): userIDentry = IDentry.get() if userIDentry == '': exit() headerFrame = Frame(root, width=5, height=5) headerFrame.grid(row=0, column=0) channelFrame = Frame(root, width=720, height=400) channelFrame.grid(row=1, column=0) channelFrame.pack_propagate(0) frame.destroy() additionalFrame = Frame(root) test = Canvas(headerFrame) testCanvas = Canvas(channelFrame) testCanvas.create_window((3,0), window=additionalFrame, anchor=NW) vbar = Scrollbar(channelFrame, orient=VERTICAL) vbar.pack(side=RIGHT, fill=Y) vbar.config(command=testCanvas.yview) sampleOutput = ttk.Label(test, text="Sample") sampleOutput.grid(row=1, column=1) secondFrameOutput = ttk.Label(additionalFrame, text="My scrolling behavior is off", font="Verdana 10 bold") secondFrameOutput.grid(row=0, column=1) closeButton = ttk.Button(additionalFrame, text="Close", command=close) closeButton.grid(row=1, column=2) testCanvas.config(width=2200, height=600) testCanvas.config(yscrollcommand=vbar.set) testCanvas.pack() testCanvas.config(scrollregion=(0,0,700,1145)) test.config(width=50, height=50) test.pack() root.bind('<Return>', submit) submitButton = ttk.Button(frame, text="Submit", command=submit) submitButton.bind('<Button-1>', submit) submitButton.pack() root.mainloop() |
老实说,我认为你需要抛开所有的代码重新开始。这有太多的错误——你试图用太多未知变量来解一个方程。
例如,您在根窗口中创建一个框架并将其打包,然后销毁它并使用网格添加一些其他小部件。虽然可以实现这一点,但是很难理解代码在做什么。这是问题的一部分吗?这是完全无关的吗?你怎么知道的?
您还创建了一个只有5x5像素的标题框-为什么这么小?在代码顶部附近创建画布,然后在代码底部附近配置大小。你创造了一个标签,然后把它包装在画布上——把一些东西包装在画布上是可能的,但我怀疑它做了你认为它做的。
从创建单个帧的函数(或类)开始。忽略初始条目小部件和按钮,将焦点放在框架上。在这个函数中,添加一个顶部和底部框架。停下来,确保它们都出现在它们应该出现的地方,并且大小符合您的需要。在开发过程中给它们不同的背景色,也许也给它们一个宽度和高度。只需要计算,这样方程中的变量就少了一个。请确保在调整窗口大小时行为正确。
接下来,只添加一个画布,并为该画布添加滚动条。停下来,确保它正常工作,并确保你的帧继续按照它们应该的方式工作。滚动条不会滚动,因为画布上没有任何内容,但这还不重要。
对其余的小部件继续这样做。在每个小部件正常工作之前不要进行任何操作。
要创建图形用户界面,必须有条理。不要一开始就试图同时处理六个小部件。从一两个开始,让他们工作,再加一个,等等。