【发布时间】:2014-11-23 00:27:06
【问题描述】:
所以我一直在玩 Tkinter 中的小部件,由于一个问题(在这个论坛上已解决),我意识到你不能使用 .pack() 和 .grid() 方法在同一个窗口中组织不同的小部件.下面的代码创建了一个画布,我已经向这个小部件添加了一个滚动条。最初我使用.grid() 安排了画布,但是当我添加滚动条时,我不得不将其更改为.pack()(因为滚动条需要 .pack() 才能正确定位它)。
from tkinter import *
x = 10
y = 10
a = 100
b = 100
def change_coord(event):
global coord
if event.keysym == 'Up':
coord[1] -=1
coord[3] -=3
if event.keysym == 'Down':
coord[1] +=1
coord[3] +=3
if event.keysym == 'Right':
coord[0] +=1
coord[2] +=3
if event.keysym == 'Left':
coord[0] -=1
coord[2] -=3
canvas1.coords(arc, *coord)
window = Tk()
window.geometry("500x500")
#canvas scroll bar
scrollbar = Scrollbar(window)
scrollbar.pack(side=RIGHT, fill=Y)
#canvas and drawing
canvas1=Canvas(window, yscrollcommand=scrollbar.set, height = 600, width = 600)
canvas1.pack()
coord = [x, y, a, b]
arc = canvas1.create_rectangle(*coord, outline="#fb0", fill="#fb0")
#canvas scrollbar continued
scrollbar.config(command=canvas1.yview)
canvas1.configure(scrollregion=(0,0,1000,1000))
#capturing keyboard inputs and assigning to function
window.bind_all('<Up>', change_coord)
window.bind_all('<Down>', change_coord)
window.bind_all('<Left>', change_coord)
window.bind_all('<Right>', change_coord)
window.mainloop()
因此,我的问题是:如果我要在窗口中有更多小部件,并且由于可滚动画布而无法使用 .grid() 方法来排列它们,那么将这些其他小部件组织为的最佳方法是什么.pack() 方法似乎并不那么容易安排小部件? (网格似乎更容易将小部件准确放置在您想要的位置)
E.G 排列这些小部件示例(在与上面的画布相同的窗口内)而不是使用.grid() 方法的最佳方法是什么?
#spinboxes and capturing value
v=IntVar()
spin = Spinbox(window, textvariable=v, from_=1, to = 10)
spin.grid(row=1, column = 0, sticky= W)
#checkboxes and capturing value
var1 = IntVar()
c1 = Checkbutton(window, text="Check!", variable=var1)
c1.grid(row=2, column = 0, sticky= W)
var2 = IntVar()
c2 = Checkbutton(window, text="Check Dis!", variable=var2)
c2.grid(row=3, column = 0, sticky= W)
var3 = IntVar()
c3 = Checkbutton(window, text="Check Dis Out!", variable=var3)
c3.grid(row=4, column = 0, sticky= W)
#message box like a label
message = Message(window, text="Test")
message.grid(row=5, column = 0, sticky= W)
#radiobuttons and caputring input
radiovar = IntVar()
rb = Radiobutton(window, text="One", variable=radiovar, value=1)
rb.grid(row=6, column = 0, sticky= W)
rb = Radiobutton(window, text="Two", variable=radiovar, value=2)
rb.grid(row=7, column = 0, sticky= W)
#radioboxes and caputring input
radiobutval = IntVar()
rb = Radiobutton(window, text="One", indicatoron=0, variable=radiobutval, value=10)
rb.grid(row=8, column = 0, sticky= W)
rb = Radiobutton(window, text="Two", indicatoron=0, variable=radiobutval, value=20)
rb.grid(row=9, column = 0, sticky= W)
谢谢
编辑: 好的,所以我一直在阅读以试图得到答案。一种有效的方法是使用框架吗?如果我创建了 2 个框架,是否可以使用 .grid() 方法将一些小部件安排在一个框架中,而使用 .pack() 方法将其他小部件(例如画布)安排在另一个框架中?这是在同一个窗口中使用两种不同的布局管理方法的解决方案吗?
【问题讨论】:
-
您可以使用
.place(x=???, y=???)将小部件“准确定位在您想要的位置”,请参阅:effbot.org/tkinterbook/place.htm 等。 -
"scroll required .pack()" 是错误的陈述。没有什么需要打包。您可以使用带有滚动条的包、位置或网格。