所以我一直在玩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()方法将其他小部件(例如画布)排列在另一个框架中吗?这是在同一窗口中使用两种不同布局管理方法的解决方案吗?
答案 0 :(得分:2)
如果我创建了2帧,那么可以将一些小部件排列在一起 使用.grid()方法和其他小部件(如画布)的框架 使用.pack()方法安排在另一帧中?这是一个 解决方案使用两种不同的布局管理方法 窗口?
是的,在一个框架中使用网格并在另一个框架中打包是很常见的事情。