Canvas 使用python 3.2.2 tkinter,我创建了一个附带滚动条的画布,但是画布中的数据不';当我移动滚动条时,不能滚动

Canvas 使用python 3.2.2 tkinter,我创建了一个附带滚动条的画布,但是画布中的数据不';当我移动滚动条时,不能滚动,canvas,python-3.x,tkinter,scrollbar,Canvas,Python 3.x,Tkinter,Scrollbar,使用Python3.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,

使用Python3.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()
滚动条确实可以滚动画布。您正在创建的小部件(以非常不寻常的方式)不是画布的一部分,因此它们不会滚动。如果在画布上使用绘图命令,您将看到画布项目实际上是滚动的

为了让小部件滚动,您必须使用
create\u window
将它们嵌入画布中。如果您试图创建滚动框架,典型的解决方案是将所有小部件放在一个框架中,使用
create\u 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)
工作代码示例:

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()

非常感谢你的帮助。我肯定错过了创建窗口。我已经实现了您的迭代代码以及创建窗口,现在我有了一个工作滚动框。