在同一个tkinter窗口中同时使用.pack()和.grid()方法的解决方案?

时间:2014-09-28 14:30:07

标签: python tkinter

所以我一直在玩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()方法将其他小部件(例如画布)排列在另一个框架中吗?这是在同一窗口中使用两种不同布局管理方法的解决方案吗?

1 个答案:

答案 0 :(得分:2)

  

如果我创建了2帧,那么可以将一些小部件排列在一起   使用.grid()方法和其他小部件(如画布)的框架   使用.pack()方法安排在另一帧中?这是一个   解决方案使用两种不同的布局管理方法   窗口?

是的,在一个框架中使用网格并在另一个框架中打包是很常见的事情。