Tkinter将窗口中的所有小部件居中

时间:2019-07-18 08:20:43

标签: python python-3.x user-interface tkinter

我正在使用tkinter使用网格构建GUI。我需要将所有对象置于窗口中心。所有问题和按钮的长度都是不同的,因此对于不占据整个窗口的较短问题和按钮,我希望它们在x轴上居中。

我已经研究了这个问题,并找到了一个使用place的解决方案,但是我必须重写整个应用程序,因为它当前正在使用网格。

def createWidgets(self):

        self.question = tk.Label(self, text="What is Prague the capital of?\n")
        self.question.grid(row=1, column=1, columnspan=2)

        self.option1 = tk.Button(self, width=12)
        self.option1["text"] = "Romania"
        self.option1["command"] = self.wrong1
        self.option1.grid(column=1, row=2, padx=1, pady=1)

        self.option2 = tk.Button(self, width=12)
        self.option2["text"] = "Slovakia"
        self.option2["command"] = self.wrong1
        self.option2.grid(column=2, row=2, padx=1, pady=1)

        self.option3 = tk.Button(self, width=12)
        self.option3["text"] = "Czech Republic"
        self.option3["command"] = self.correct1
        self.option3.grid(column=1, row=3, padx=1, pady=1)

        self.option4 = tk.Button(self, width=12)
        self.option4["text"] = "Ukraine"
        self.option4["command"] = self.wrong1
        self.option4.grid(column=2, row=3, padx=1, pady=1)

我想将所有内容都置于createWidgets内部,以便它始终始于y轴的顶部,但始终位于x轴的中间。 我现在使用root.geometry("250x160")来调整窗口大小, root.resizable(0, 0)停止调整其大小的变量。

2 个答案:

答案 0 :(得分:1)

我假设您的课程是从tk.Frame继承的。您不必在类中进行任何修改-而是通过传递packfill来更改框架expand的方式。

import tkinter as tk

class MainFrame(tk.Frame):
    def __init__(self,master=None,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.question = tk.Label(self, text="What is Prague the capital of?\n")
        self.question.grid(row=1, column=1, columnspan=2)

        self.option1 = tk.Button(self, width=12)
        self.option1["text"] = "Romania"
        #self.option1["command"] = self.wrong1
        self.option1.grid(column=1, row=2, padx=1, pady=1)

        self.option2 = tk.Button(self, width=12)
        self.option2["text"] = "Slovakia"
        #self.option2["command"] = self.wrong1
        self.option2.grid(column=2, row=2, padx=1, pady=1)

        self.option3 = tk.Button(self, width=12)
        self.option3["text"] = "Czech Republic"
        #self.option3["command"] = self.correct1
        self.option3.grid(column=1, row=3, padx=1, pady=1)

        self.option4 = tk.Button(self, width=12)
        self.option4["text"] = "Ukraine"
        #self.option4["command"] = self.wrong1
        self.option4.grid(column=2, row=3, padx=1, pady=1)

root = tk.Tk()
frame = MainFrame(root)
frame.pack(fill=tk.Y,expand=True)
root.mainloop()

如果即使在根级别也要使用grid,则可以使用以下内容:

root = tk.Tk()
frame = MainFrame(root)
frame.grid(row=0,column=0,sticky="ns")
root.grid_columnconfigure(0,weight=1)
root.mainloop()

答案 1 :(得分:0)

ExecutionAndPublication几何管理器将所有小部件集中在如下所示的列中:

enter image description here

pack