Python:如何在tkinter窗口中居中

时间:2017-09-06 07:45:16

标签: python tkinter

我正在尝试构建一个弹出窗口,其中包含不同的文本消息供用户响应。

我寻找一种方法将文本(标签)和按钮放在窗口中心 - 但没有成功。

Popup window

弹出窗口具有确定的大小。将框架对中在其中应考虑textlabel的宽度和高度(以字母数量定义)。

正如您在代码中看到的那样,wh定义了窗口的大小,xbiasybias有一个表达式,以testframe为中心(均包含alpha1alpha2作为文字大小的修正系数

我正在寻找alpha1alpha2(现在等于1)的数学表达式......或者是构建这样一个弹出窗口的更好方法。

root = Tk()
w = '400'
h = '100'
root.geometry('{}x{}'.format(w, h))
root.configure(bg='lightgreen')

txt = StringVar()
txt.set("This is an error message")

alpha1 = 1
alpha2 = 1
xbias = int(w) / 2 - (len(txt.get()) / 2) * alpha1
ybias = int(h) / 2 - alpha2

testframe = ttk.Frame(root)
testframe.grid(row=0, column=1, pady=ybias, padx=xbias)

label1 = ttk.Label(testframe, textvariable=txt)
label1.grid(row=0, column=0)

2 个答案:

答案 0 :(得分:3)

您是否考虑过使用.pack()方法。你可以通过这种方式更轻松地达到预期的效果:

from tkinter import *

root = Tk()
top = Toplevel(root)

w = '400'
h = '100'
top.geometry('{}x{}'.format(w, h))

frame = Frame(top)

label = Label(frame, text="This is an error message")
button = Button(frame, text="Ok")

frame.pack(expand=True) #expand assigns additional space to the frame if the parent is expanded
label.pack()
button.pack()

root.mainloop()

经过一些研究,用网格做这件事比预期的要容易得多,见下文:

from tkinter import *

root = Tk()

w = '400'
h = '100'
root.geometry('{}x{}'.format(w, h))

label = Label(root, text="text")
label.grid(column=0, row=0)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

root.mainloop()

如果我们指定.rowconfigure().columnconfigure() weight不是0,那么指定的行和列将展开以填充窗口中给定的空间。

答案 1 :(得分:0)

在根窗口中居中框架的方法可以这种方式完成:

  

A部分)创建一个具有特定大小hw的窗口(因为它是一个   弹出窗口 - 在这个例子中我禁用它的大小调整)。在框架内 - a   LabelButton

root = Tk()
w = '200'
h = '80'
root.geometry('{}x{}'.format(w, h))
root.configure(bg='lightgreen')    ###To diff between root & Frame
root.resizable(False, False)

txt = StringVar()
txt.set("This is an error message")

testframe = ttk.Frame(root)
testframe.grid(row=0, column=1)

label1 = ttk.Label(testframe, textvariable=txt)
label1.grid(row=0, column=0, pady=10)

ok_button = ttk.Button(testframe, text="OK", command=root.destroy)
ok_button.grid()
  

B部分)为了获得框架的尺寸(包括Label和   Button内部)我们使用testframe.update()然后   testframe.winfo_width() testframe.winfo_height()获取框架   更新的值。 xbiasybias计算要放置的中心   中间的框架:

testframe.update()

xbias = int(w) / 2 - testframe.winfo_width() / 2
ybias = int(h) / 2- testframe.winfo_height() / 2
testframe.grid(row=0, column=1, pady=ybias, padx=xbias)

root.mainloop()