如何在 tkinter 的 window 中心使用网格对齐 Optionmenu?

How align Optionmenu using grid in centre of window in tkinter?

我试图将 Optionmenu 居中并排对齐,但每当我取消注释 .grid() 语句时,window 中什么也没有显示,它变成空白。

import tkinter as tk
from utils import editionMap, topicMap, langMap

class OptionMenu(tk.Frame):

    def __init__(self, master, status, *options):
        self.frame = tk.Frame(master)
        self.frame.pack()

        self.status = tk.StringVar()
        self.status.set(status)

        self.dropdown = tk.OptionMenu(self.frame, self.status, *options)
        self.dropdown.pack()


def main():
    root = tk.Tk()
    Edition_Filter = OptionMenu(root, "Edition", *editionMap.keys())
    #Edition_Filter.grid(row=0, column=0)  <---Uncomment
    Language_Filter = OptionMenu(root, "Language", *langMap.keys())
    #Language_Filter.grid(row=0, column=1) <---Uncomment
    Topic_Filter = OptionMenu(root, "Topic", *topicMap.keys())
    #Topic_Filter.grid(row=0, column=2)    <---Uncomment

    root.mainloop()

if __name__ == '__main__':
    main()

我希望显示选项菜单 Edition Language Topic 水平并排。

我的实际输出是:

你混合了两种不同的技术

第一:继承

class OptionMenu(tk.Frame): # <-- with Frame

    def __init__(self, master, status, *options):

        super().__init__(master) # <-- with super()

第二:包括

class OptionMenu(): # <-- without Frame

    def __init__(self, master, status, *options):

        self.frame = tk.Frame(master) # <-- create inner widget

首先创建可以使用 menu.pack()menu.grid()

的真实小部件

第二个不创建小部件 - 它创建普通的 class,里面有小部件,你必须使用 menu.frame.pack()menu.frame.grid()


带有真实小部件的示例

import tkinter as tk

class OptionMenu(tk.Frame): # <-- with Frame

    def __init__(self, master, status, *options):

        super().__init__(master) # <-- with super()

        self.status = tk.StringVar()
        self.status.set(status)

        # use `self` as parent for widgets inside

        self.dropdown = tk.OptionMenu(self, self.status, *options)
        self.dropdown.pack()


def main():

    editionMap = {1:"English", 2:"German", 3:"Russian"}
    langMap = {1:"English", 2:"German", 3:"Russian"}
    topicMap = {1:"English", 2:"German", 3:"Russian"}

    root = tk.Tk()

    Edition_Filter = OptionMenu(root, "Edition", *editionMap.keys())
    Edition_Filter.grid(row=0, column=0)

    Language_Filter = OptionMenu(root, "Language", *langMap.keys())
    Language_Filter.grid(row=0, column=1)

    Topic_Filter = OptionMenu(root, "Topic", *topicMap.keys())
    Topic_Filter.grid(row=0, column=2)

    root.mainloop()

if __name__ == '__main__':
    main()