Как получить значение из выбранной радиокнопки после root.mainloop ()? - PullRequest
0 голосов
/ 22 марта 2019

Я хочу написать всплывающее окно, в котором пользователю предлагается выбрать конкретную опцию и, если опция не существует, добавить ее.Однако у меня возникают проблемы с получением значения выбранного параметра (то есть ключа из dict).Мой код - summarized-- до сих пор:

import tkinter as tk

class Category():

    def __init__(self):
        self.categories = {1:"Coffee",2: "Tesco"}

    def index(...):

        # code ... #

        root = tk.Tk()
        v = tk.IntVar()

        # I was thinking this would help:
        def quit():
            global irow
            irow = v.get()
            print("Irow is",irow)
            root.quit()

        tk.Label(root, text="Choose category:").pack()
        for key, cat in self.categories.items():
            tk.Radiobutton(root, text=cat, variable=v, value=key).pack()
        tk.Radiobutton(root, text="Other", variable=v, value=key+1).pack()
        # I want to add a text box here so user can add the "Other"

        tk.Button(root, text="Close", command=quit)
        irow = v.get()
        print(irow)
        root.mainloop()
        print(irow)
        # code which uses irow #

Выполнение этого кода дает:

0
Irow is 0
0

независимо от того, какую кнопку я выбрал.Я ожидаю, что irow будет 2, если я должен был выбрать Tesco или 1, если я выбрал кофе (или 3, если я выбрал другой).Любое руководство будет очень цениться.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Обычно mainloop выходит только после того, как все виджеты были уничтожены. Таким образом, вы не можете напрямую получить значения из виджетов на данный момент. Самое простое решение - сохранить значение в глобальной переменной или переменной экземпляра, если вы используете классы.

Например, в вашем случае вы можете сделать это:

def quit():
    self.irow = v.get()
    root.quit()

Затем, после существования mainloop, вы можете получить доступ к self.irow

...
root.mainloop()
print(self.irow)
0 голосов
/ 23 марта 2019

Спасибо Брайану Оукли за ответ. Я сделал 4 изменения, чтобы он работал на терминале Linux: 1) Я изменил класс с Tk () на Toplevel (); 2) Я помещаю диалог в класс для чистоты; 3) я изменил self.quit () на self.destroy (); & 4) Я изменил mainloop () на wait_window ().

class AddCategory(tk.Toplevel):

    def __init__(self, parent):
        tk.Toplevel.__init__(self)
        self.v = tk.IntVar()
        self.parent = parent

        tk.Label(self, text="Choose category:").pack()

        for key, cat in self.parent.categories.items():
            tk.Radiobutton(self, text=cat, variable=self.v, value=key).pack()
        tk.Radiobutton(self, text="Other", variable=self.v, value=key+1).pack()

        self.e = tk.Entry(self,text="")
        self.e.pack()
        tk.Button(self, text="Close", command=self.quit).pack()

    def quit(self):
        self.parent.key = self.v.get()
        self.parent.cat = self.e.get()
        print(self.v.get())
        print(self.e.get())
        self.destroy()

Обратите внимание, что parent - это класс, из которого я запускаю диалог "AddCategory". Я вызываю это следующим образом:

class Category():

    def __init__(self):
        self.cat = self.key = self.desc = []
        self.categories = {1:"Coffee",2: "Tesco"}
        self.descriptions = {}
    def index(...):

        # code ... #
        dialog = AddCategory(self) # I pass the parent onto the dialog
        dialog.wait_window()
        print(self.key)
        print(self.cat)

Это работает, потому что self.parent внутри AddCategory является мягкой копией parent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...