Сохранить выбор выпадающего меню tkinter в переменной для сравнения - PullRequest
1 голос
/ 10 июня 2019

Я хочу использовать выпадающее меню, после выбора одного из вариантов необходимо выполнить другой расчет.Есть ли способ сохранить и сравнить выбор для использования в переменной?

from tkinter import *

root = Tk()
root.title("Calculate")

# Create a Tkinter variable
tkvar = StringVar(root)

# Dictionary with options
choices = sorted({'Good', 'Bad', 'Medium'})
tkvar.set('Good')  # set the default option

popupMenu = OptionMenu(root, tkvar, *choices)
Label(root, text="Please choose").grid(row=2, column=2)
popupMenu.grid(row=3, column=2)
b2 = Button(root, text='Close', command=root.quit)
b2.grid(row=6, column=2)

# on change dropdown value
def change_dropdown(*args):
    global dropdown
    dropdown = str(tkvar.get())
    print(dropdown)
    return dropdown

# link function to change dropdown
tkvar.trace('w', change_dropdown)

if tkvar.get == 'Good':
    print(5)

if tkvar.get == "Bad":
    print(10)

root.mainloop()

Если что-то выбрано, функция изменения / печати работает нормально.Только функции if не приводят ни к какому выводу.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Так что это класс виджетов, который я использую, когда мне нужно выпадающее меню.Он вызывает функцию всякий раз, когда значение изменилось.он использует ttk вместо вашего tk виджета, но они работают вместе (ttk более нативный).

from tkinter import ttk


class Dropdown(ttk.Combobox):
    def __init__(self, master, values, command = None):
        super().__init__(master=master, state="readonly")

        self["values"] = values

        if len(values) == 0:
            raise Exception("Dropdown values cannot be of length 0")

        self.current(0)  # Current value index

        self.command = command
        self.prev_val = self["values"][0]

        self.bind("<<ComboboxSelected>>", self.on_selected)

    @property
    def values(self):
        return self["values"]

    def on_selected(self, event=None):
        # Stops the callback from being called if the value is the same previously
        if self.get() != self.prev_val:
            self.prev_val = self.get()

            if self.command is not None:
                self.command()

    # Returns the index of the current value
    def get_index(self):
        return self["values"].index(self.get())

EDIT: Вы можете проверить виджет, используя следующий код

import tkinter as tk

def dropdown_callback():
    print("Value:", dropdown.get(), "| Index:", dropdown.get_index(), "| Values:", dropdown.values)

root = tk.Tk()

dropdown = Dropdown(root, ("Value 1", "Value 2", "Value 3"), dropdown_callback)

dropdown.pack()
0 голосов
/ 10 июня 2019

Вы связываете изменение с функцией в вашем случае change_dropdown, поэтому ваш if не входит в эту функцию, вставьте его, и это будет работать.

Также вам нужно использовать tkvar.get () <- скобки. </p>

from tkinter import *

root = Tk()
root.title("Calculate")

# Create a Tkinter variable
tkvar = StringVar(root)

# Dictionary with options
choices = sorted({'Good', 'Bad', 'Medium'})
tkvar.set('Good')  # set the default option

popupMenu = OptionMenu(root, tkvar, *choices)
Label(root, text="Please choose").grid(row=2, column=2)
popupMenu.grid(row=3, column=2)
b2 = Button(root, text='Close', command=root.quit)
b2.grid(row=6, column=2)

# on change dropdown value
def change_dropdown(*args):
    global dropdown
    dropdown = str(tkvar.get())
    print(dropdown)

    if tkvar.get() == 'Good':
        print(5)

    if tkvar.get() == "Bad":
        print(10)

# link function to change dropdown
tkvar.trace('w', change_dropdown)

root.mainloop()

ПРИМЕЧАНИЕ:

root.mainloop() заблокирует поток.
Возможно сохранение ответов в базе данных.

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