我已经制作了位于窗口中心的 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自动处理重叠。
