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 に答える