我已经制作了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),但它给出了奇怪的输出看截图。
答案 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()
选项:它可以是基点n
,s
,e
,{{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
或作为选项y
和relx
的相对位置。因此,rely
表示容器宽度的一半(在代码示例中,容器为relx=0.5
)。root
确定小部件的哪个部分放在anchor
中给出的坐标处。因此,.place
会将窗口小部件的左上角放置在位置(x,y)。使用widget.place(x=x, y=y, anchor='nw')
,窗口小部件可以放在任意位置,但您必须手动处理重叠问题,而place
和pack
会自动处理重叠。