首页 文章

Tkinter - 帧滚动到另一帧?

提问于
浏览
-1

我有一个问题,我在网格上有两个帧;一个在顶部,一个在底部 . 两者都有框架中的画布 . 在底部画布中,我有一个滚动条 . 唯一的问题是,当我向下滚动时,该画布的内容(以及框架)滚动到顶部框架,这显然不太理想 .

我试图限制每个的宽度和高度无济于事,我想知道是否有一些东西可以使内容在框架内“消失”,而不是只留下自己的框架 . 网络上的任何滚动内容都是这样做的,因此必须有一种方法 .

这是我的代码; “test”是顶部画布,“testCanvas”是底部框架中创建的底部画布 . 如您所见,“testCanvas”滚动到“test” . 我已经尝试过使用tutorialspoint,effbot和stackoverflow,但我无法弄明白 .

#!/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()

1 回答

  • 1

    老实说,我认为你需要抛弃所有代码并重新开始 . 它有太多错误 - 你试图解决一个包含太多未知变量的方程式 .

    例如,您在根窗口中创建一个框架并将其打包,然后将其销毁并使用网格添加其他一些小部件 . 尽管可以实现这一目标,但却很难掌握代码的作用 . 这是问题的一部分吗?它完全不相关吗?你怎么知道的?

    你还创建了一个只有5x5像素的 Headers 框 - 为什么这么小?您可以在代码顶部附近创建一个画布,然后在代码底部附近配置大小 . 你创建一个标签并将其打包在画布中 - 在画布中包装一些东西是可能的,但我怀疑它是否符合你的想法 .

    从创建单个框架的函数(或类)开始 . 忽略初始条目小部件和按钮,专注于框架 . 在该功能中添加顶部和底部框架 . 停下来,确保它们都出现在你应该的位置和你想要的大小 . 在开发过程中给它们不同的背景颜色,也可以给它们宽度和高度 . 得到那个工作,这样它在等式中的变化就少了一个 . 调整窗口大小时确保行为正常 .

    接下来,仅添加一个画布,并添加该画布的滚动条 . 停止并确保其有效,并确保您的框架继续按照应有的方式运行 . 滚动条不会滚动,因为画布上没有任何内容,但这还不重要 .

    对于其余的小部件,请继续这样 . 在每个窗口小部件正常运行之前不要进展 .

    要创建GUI,您必须有条不紊 . 不要只是开始尝试同时处理六个小部件 . 从一两个开始,让它们工作,再添加一个,依此类推 .

相关问题