【问题标题】:python-tkinter how to get one more argument in OptionMenu-commandpython-tkinter 如何在 OptionMenu-command 中获取更多参数
【发布时间】:2021-03-09 00:29:11
【问题描述】:

当我正在处理下面提到的代码时,如何从每次迭代中获取“optMenFunc”函数中的值和占位符,该代码有四个类:SampleApp、StartPage、PageOne、PageTwo。第一页有带有 for 循环的选项菜单。我正在关注这个答案:Switch between two frames in tkinter


import tkinter as tk


class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page")
        label.pack(side="top", fill="x", pady=10)

        button1 = tk.Button(self, text="Go to Page One",
                            command=lambda: controller.show_frame("PageOne"))
        button2 = tk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()


class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1")
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()

        placeHolders = ['one', 'two']
        for placeHolder in placeHolders:

            self.options = tk.StringVar()
            self.options.set('select')
            self.menu = tk.OptionMenu(self, self.options, "miss", "mr", "mrs", command = self.optMenFunc)
            self.menu.pack()  

    def optMenFunc(self, value):
        print("i need to print here value with placeholder")


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()





【问题讨论】:

    标签: python python-3.x tkinter optionmenu


    【解决方案1】:

    您可以使用lambda,就像您在另一个commands 中所做的那样。

    self.menu = tk.OptionMenu(self, self.options, "miss", "mr", "mrs", command=lambda v, ph=placeHolder: self.optMenFunc(v, ph))
    

    def optMenFunc(self, value, placeholder):
        print(f"value:{value} and placeholder:{placeholder}")
    

    注意:

    答:command=lambda v: self.optMenFunc(v, placeHolder)

    乙:command=lambda v, ph=placeHolder: self.optMenFunc(v, ph)

    您必须像 (B) 一样在 lambda 中设置参数。如果您按照 (A) 方式进行操作,placeHolder 将等于它的 final 迭代值,无论您选择哪个 OptionMenu。通过将其作为lambda 的参数,您将其当前迭代值保存到ph

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多