【问题标题】:A solution to using both the .pack() and .grid() method in the same tkinter window?在同一个 tkinter 窗口中同时使用 .pack() 和 .grid() 方法的解决方案?
【发布时间】: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()" 是错误的陈述。没有什么需要打包。您可以使用带有滚动条的包、位置或网格。

标签: python tkinter


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多