Skip to main content
 首页 » 编程设计

python之如何将 OptionMenu 并排放置在 tkinter 中

2025年05月04日13powertoolsteam

我已经制作了位于窗口中心的 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) 但它给出了奇怪的输出,请参见屏幕截图。

请您参考如下方法:

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

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() 中的选项: 可以是基点的任意组合 n , s , e , w .例如,sticky='e'意味着小部件将位于网格单元格的东侧,sticky='ew'意味着它将水平填充该列。

2) 与 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选项 o .pack()是'top' , 所以 frame被放置在窗口的上部中心。但是要在框架中并排显示选项菜单,您需要使用 'left'或 'right' .

pack如果您的布局简单,则很容易使用。但是一旦你想要更复杂的东西,你需要使用很多框架容器来获得你想要的东西,所以使用起来更容易grid相反。

3) 与 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 将小部件的位置作为绝对位置(以像素为单位,相对于容器的左上角)和 y或作为选项的相对位置 relx和 rely .所以,relx=0.5表示容器宽度的一半(在代码示例中,容器为 root )。
  • 选项anchor确定小部件的哪一部分放在 .place 中给定的坐标处.所以widget.place(x=x, y=y, anchor='nw')会将小部件的左上角放在位置 (x, y)。

与 place ,小部件可以放在任意位置,但是您必须手动处理重叠问题,同时 pack和 grid自动处理重叠。