【问题标题】:Using python 3.2.2 tkinter I create a canvas with scrollbars attached but the data inside the canvas doesn't scroll when I move the scrollbars使用 python 3.2.2 tkinter 我创建了一个带有滚动条的画布,但是当我移动滚动条时画布内的数据不会滚动
【发布时间】:2012-11-28 20:50:57
【问题描述】:

使用 python 3.2.2 tkinter 我创建了一个带有滚动条的画布,但是当我移动滚动条时画布内的数据不会滚动。 tkinter 的语法问题或错误?

示例代码:

from tkinter import *

## GUI color map ###
black = "#000000"

root = Tk()
root.minsize(100,100)
root.maxsize(500,500)
root.resizable(0,0)

topFrame = Frame(root, bd=2, relief=SUNKEN)
topFrame.pack()

xscrollbar = Scrollbar(topFrame, orient=HORIZONTAL)
xscrollbar.pack(side=BOTTOM, fill=X)

yscrollbar = Scrollbar(topFrame, orient=VERTICAL)
yscrollbar.pack(side=RIGHT, fill=Y)

conFrame = Canvas(topFrame, bd=0, scrollregion=(0, 0, 1000, 1000),
                xscrollcommand=xscrollbar.set,
                yscrollcommand=yscrollbar.set)

conFrame.pack(side=TOP, fill=BOTH, expand=1)
xscrollbar.config(command=conFrame.xview)
yscrollbar.config(command=conFrame.yview)

for i in range(1,30):
    function_name = 'my'+str(i)+'ItemList = StringVar()'
    exec(function_name)
    function_name = 'my'+str(i)+'Item = '+str(i)
    exec(function_name)
    function_name = 'my'+str(i)+'ItemList.set(my'+str(i)+'Item)'
    exec(function_name)
    function_name = 'my'+str(i)+'ItemListEntry = Entry(conFrame, width=148,     foreground=black, textvariable=my'+str(i)+'ItemList)'
    exec(function_name)
    function_name = 'my'+str(i)+'ItemListEntry.pack(side=TOP, padx=2)'
    exec(function_name)

mainloop()

【问题讨论】:

    标签: canvas python-3.x tkinter scrollbar


    【解决方案1】:

    滚动条滚动画布。您正在创建的小部件(以一种高度不寻常的方式)不是画布的一部分,因此它们不会滚动。如果您在画布上使用绘图命令,您会看到画布项目实际上是滚动的。

    为了让小部件滚动,您必须使用create_window 将它们嵌入到画布中。如果您尝试创建滚动框架,典型的解决方案是将所有小部件放在一个框架中,使用create_window 将该框架添加到画布,然后将scrollregion 设置为框架的大小(您必须在屏幕更新后执行此操作,因为在实际呈现小部件之前不会计算大小)

    顺便说一句,您为什么使用 exec?它使您的代码非常难以理解,并且您没有得到任何回报。你知道你可以用更简单的东西代替这 10 行吗?例如:

    var = {}
    for i in range(1,30):
        var[i] = StringVar()
        var[i].set(i)
        e = Entry(conFrame, width=148, foreground=black, textvariable=var[i])
        e.pack(side=TOP, padx=2)
    

    【讨论】:

    • 非常感谢您的帮助。我肯定错过了create_window。我已经实现了你的迭代代码和创建窗口,我现在有一个工作滚动框架。
    【解决方案2】:

    工作代码示例:

    from tkinter import *
    
    ## GUI color map ###
    black = "#000000"
    
    root = Tk()
    root.title("Canvas Scrollbar Example")
    root.minsize(100,100)
    root.maxsize(500,500)
    root.resizable(0,0)
    
    topFrame = Frame(root, bd=2, relief=SUNKEN)
    topFrame.pack()
    
    xscrollbar = Scrollbar(topFrame, orient=HORIZONTAL)
    xscrollbar.pack(side=BOTTOM, fill=X)
    
    yscrollbar = Scrollbar(topFrame, orient=VERTICAL)
    yscrollbar.pack(side=RIGHT, fill=Y)
    
    canvasFrame = Canvas(topFrame, width=500, height=500, scrollregion=(0, 0, 1000, 1000),
                    xscrollcommand=xscrollbar.set,
                    yscrollcommand=yscrollbar.set)
    
    canvasFrame.pack(side=TOP, fill=BOTH, expand=1)
    
    xscrollbar.config(command=canvasFrame.xview)
    yscrollbar.config(command=canvasFrame.yview)
    
    entryFrame = Frame(canvasFrame, bd=2, relief=SUNKEN)
    entryFrame.pack()
    
    var = {}
    for i in range(1,30):
        var[i] = StringVar()
        var[i].set(i)
        e = Entry(entryFrame, width=148, foreground=black, textvariable=var[i])
        e.pack(side=TOP, padx=2)
    
    canvasFrame.create_window(0, 0, window=entryFrame, anchor='nw')
    
    mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2017-09-29
      • 2014-06-04
      • 1970-01-01
      • 2015-03-16
      • 2011-12-05
      相关资源
      最近更新 更多