如何将OptionMenu并排放置在tkinter中?

时间:2017-12-11 14:54:46

标签: python tkinter

我已经制作了OptionMenu,它位于窗口的中心,但是第二个OptionMenu应该是它的旁边而不是它的下方。我怎样才能将它并排放置。

from Tkinter import*

class MyOptionMenu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options)
        self.config(font=('calibri',(10)),bg='white',width=12)
        self['menu'].config(font=('calibri',(10)),bg='white')

root = Tk()
mymenu1 = MyOptionMenu(root, 'Select status', 'a','b','c')
mymenu2 = MyOptionMenu(root, 'Select another status', 'd','e','f')
mymenu1.pack()
mymenu2.pack()
root.mainloop()

我尝试了mymenu2.pack(side = LEFT),但它给出了奇怪的输出看截图。

screenshot

4 个答案:

答案 0 :(得分:2)

您需要修改两个菜单的选项,如下所示:

mymenu1.pack(side="left")
mymenu2.pack(side="right")

对于更复杂的布局,请尝试使用grid代替pack

答案 1 :(得分:2)

使用place代替pack几何体,这将为您提供灵活性

from Tkinter import *

class MyOptionMenu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options)
        self.config(font=('calibri',(10)),bg='white',width=12)
        self['menu'].config(font=('calibri',(10)),bg='white')

root = Tk()


mymenu1 = MyOptionMenu(root, 'Select status', 'a','b','c')
mymenu2 = MyOptionMenu(root, 'Select another status', 'd','e','f')
mymenu1.place(x=30, y=0) # this an example of place
mymenu2.place(x=160, y=0)
root.mainloop()

答案 2 :(得分:1)

您的问题与.pack()方法有关。默认情况下,它打包到TOP,以便小部件垂直堆叠。如果您需要并排,则需要使用side kw选项更改默认值。您pack(side=xxx)的选项是TOP,LEFT,BOTTOM,RIGHT,TOP是默认值。因此,对于两个小部件并排,你会说:

widget1.pack(side=Tkinter.LEFT)
widget2.pack(side=Tkinter.LEFT)

或者,在您的情况下,由于您执行了from Tkinter import *,您会说:

mymenu1.pack(side=LEFT)
mymenu2.pack(side=LEFT)

答案 3 :(得分:1)

为了完整起见,以下是如何将两个选项菜单并排放置在窗口的上方中央,即使在调整大小后,也可以使用三种可能的布局:

1)grid

此布局将小部件放在由行号和列号定义的单元格中。

import Tkinter as tk  # python 2
# from tkinter import tk  # python 3

class MyOptionMenu(tk.OptionMenu):
    def __init__(self, master, status, *options):
        self.var = tk.StringVar(master)
        self.var.set(status)
        tk.OptionMenu.__init__(self, master, self.var, *options)
        self.config(font=('calibri',(10)),bg='white',width=12)
        self['menu'].config(font=('calibri',(10)),bg='white')

root = tk.Tk()
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
mymenu1 = MyOptionMenu(root, 'Select status', 'a','b','c')
mymenu2 = MyOptionMenu(root, 'Select another status', 'd','e','f')
mymenu1.grid(row=0, column=0, sticky='e')
mymenu2.grid(row=0, column=1, sticky='w')
root.mainloop()

代码中的两个关键元素是:

  • root.columnconfigure(<column number>, weight=1):默认情况下,列权重为0,因此不会展开以填充窗口。您可以将此值设置为任何整数。例如,如果你有两列,一列是重量1,另一列是重量2,那么第二列的空间将是第一列的两倍。

  • sticky中的.grid()选项:它可以是基点nse,{{1}的任意组合}}。例如,w表示窗口小部件位于网格单元格的东侧,sticky='e'表示它将水平填充列。

2)sticky='ew'pack从选项中给出的一侧开始堆叠小部件,因此没有直接的方法将两个小部件并排放在窗口的上部中心。但是,这可以使用框架容器来完成:

pack

默认情况下,import Tkinter as tk class MyOptionMenu(tk.OptionMenu): def __init__(self, master, status, *options): self.var = tk.StringVar(master) self.var.set(status) tk.OptionMenu.__init__(self, master, self.var, *options) self.config(font=('calibri',(10)),bg='white',width=12) self['menu'].config(font=('calibri',(10)),bg='white') root = tk.Tk() frame = tk.Frame(root) # container mymenu1 = MyOptionMenu(frame, 'Select status', 'a','b','c') mymenu2 = MyOptionMenu(frame, 'Select another status', 'd','e','f') mymenu1.pack(side='left') mymenu2.pack(side='left') frame.pack() root.mainloop() 选项side.pack(),因此'top'位于窗口的上方中心。但要在框架中并排选项菜单,您需要使用frame'left'

如果您的布局很简单,

'right'很容易使用。但是一旦你想要更复杂的东西,你需要使用许多框架容器来获得你想要的东西,所以更容易使用pack

3)grid

place
  • import Tkinter as tk class MyOptionMenu(tk.OptionMenu): def __init__(self, master, status, *options): self.var = tk.StringVar(master) self.var.set(status) tk.OptionMenu.__init__(self, master, self.var, *options) self.config(font=('calibri',(10)),bg='white',width=12) self['menu'].config(font=('calibri',(10)),bg='white') root = tk.Tk() mymenu1 = MyOptionMenu(root, 'Select status', 'a','b','c') mymenu2 = MyOptionMenu(root, 'Select another status', 'd','e','f') mymenu1.place(relx=0.5, y=0, anchor='ne') mymenu2.place(relx=0.5, y=0, anchor='nw') root.mainloop() 可以将窗口小部件的位置作为绝对位置(以像素为单位,相对于容器的左上角)以及选项.place()x或作为选项yrelx的相对位置。因此,rely表示容器宽度的一半(在代码示例中,容器为relx=0.5)。
  • 选项root确定小部件的哪个部分放在anchor中给出的坐标处。因此,.place会将窗口小部件的左上角放置在位置(x,y)。

使用widget.place(x=x, y=y, anchor='nw'),窗口小部件可以放在任意位置,但您必须手动处理重叠问题,而placepack会自动处理重叠。