1

使用 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()
4

2 回答 2

2

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

为了让小部件滚动,您必须将它们嵌入到画布中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)
于 2012-11-28T21:15:25.110 回答
1

工作代码示例:

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()
于 2012-11-29T17:25:57.550 回答