簡體   English   中英

如何在多幀中打印 ttk.Combobox 選項?

[英]How to print out ttk.Combobox options in multiple frames?

在我的代碼中,有兩個框架。 在第一個中,我放入了一個Add按鈕,它將生成一個帶有Combobox的新框架。 我們的想法是添加一些Combobox一樣,在第一幀,選擇不同的選項,不同的Combobox ,然后打印出來,在未來框架。 但是當我在第二幀中點擊“ Show options按鈕時,它不會打印出我剛剛在第一幀中選擇的選項。 我該如何解決這個問題?

from tkinter import *
from tkinter import ttk

list_1 = []


class Validation_Tool(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = 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 (PageOne, PageTwo):
            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("PageOne")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

    def quit(self):
        self.destroy()


class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        def add_compare():
            global list_1

            frame = Frame(self)
            frame.pack()

            label_1 = Label(frame, text='Options')
            label_1.grid(row=0, column=0)

            self.options_1 = ttk.Combobox(frame, values=['a','b','c','d','e'])
            self.options_1.grid(row=1, column=0)

            list_1.append(self.options_1.get())

        quit_button = Button(self, text="Quit Program",
                    command=lambda: controller.quit())
        next_button = Button(self, text="Next",
                    command=lambda: controller.show_frame("PageTwo"))
        add_button = Button(self, text='Add', command=add_compare)

        quit_button.place(relx=0.98, rely=0.98, anchor=SE)
        next_button.place(relx=0.76, rely=0.98, anchor=SE)
        add_button.place(relx=0.661, rely=0.98, anchor=SE)


class PageTwo(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        def button():
            label = Label(self, text=list_1)
            label.pack()

        quit_button = Button(self, text="Quit Program",
                            command=lambda: controller.quit())
        back_button = Button(self, text="Back",
                            command=lambda: controller.show_frame("PageOne"))
        show_button = Button(self, text='Show options', command=button)
        show_button.pack()

        back_button.place(relx=0.76, rely=0.98, anchor=SE)
        quit_button.place(relx=0.98, rely=0.98, anchor=SE)


if __name__ == "__main__":
    root = Validation_Tool()
    root.geometry('400x300+430+250')
    root.title("Validation Tool")
    root.mainloop()

這是您的代碼的修改版本,當按下Next時,它將打印到目前為止選擇的選項。 為了防止Combobox相互干擾,保留了它們的列表和關聯的StringVar

擁有單獨的StringVar避免了在其中一個選項上選擇一個選項而在另一個上更改它的問題——即不同的textvar與每個textvar相關聯。

為了將所有選項收集到list_1 ,我們定義了一個名為selected()的回調函數,並將其“綁定”到Combobox選擇事件。 這使得除了上述之外,所選的選項也將附加到全局list_1 ,這是顯示選項按鈕顯示的內容。

from tkinter import *
from tkinter import ttk

list_1 = []


class Validation_Tool(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.comboboxes = []  # Comboboxes created. ADDED
        self.combobox_vars = []  # Vars for Comboboxes. ADDED.

        self.frames = {}
        for F in (PageOne, PageTwo):
            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("PageOne")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

    def quit(self):
        self.destroy()

class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        # Combobox event handler. ADDED
        def selected(event, var):
            list_1.append(var.get())  # Append Combobox option selected.

        def add_compare():
            frame = Frame(self)
            frame.pack()

            label_1 = Label(frame, text='Options')
            label_1.grid(row=0, column=0)

            combobox_var = StringVar()  # ADDED.
            combobox = ttk.Combobox(frame, values=list('abcde'),
                                    textvar=combobox_var)  # For each Combobox. ADDED.
            combobox.grid(row=1, column=0)
            combobox.bind('<<ComboboxSelected>>',  # Bind event handler.           ADDED.
                          lambda event, var=combobox_var: selected(event, var))  # ADDED.

            self.controller.comboboxes.append(combobox)         # ADDED.
            self.controller.combobox_vars.append(combobox_var)  # ADDED.

        quit_button = Button(self, text="Quit Program",
                             command=lambda: controller.quit())
        next_button = Button(self, text="Next",
                             command=lambda: controller.show_frame("PageTwo"))
        add_button = Button(self, text='Add',
                            command=add_compare)

        quit_button.place(relx=0.98, rely=0.98, anchor=SE)
        next_button.place(relx=0.76, rely=0.98, anchor=SE)
        add_button.place(relx=0.661, rely=0.98, anchor=SE)


class PageTwo(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        def button():
            label = Label(self, text=list_1)
            label.pack()

        quit_button = Button(self, text="Quit Program",
                            command=lambda: controller.quit())
        back_button = Button(self, text="Back",
                            command=lambda: controller.show_frame("PageOne"))
        show_button = Button(self, text='Show options', command=button)
        show_button.pack()

        back_button.place(relx=0.76, rely=0.98, anchor=SE)
        quit_button.place(relx=0.98, rely=0.98, anchor=SE)


if __name__ == "__main__":
    root = Validation_Tool()
    root.geometry('400x300+430+250')
    root.title("Validation Tool")
    root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM