Управляемое событиями управление выбором tkinter Combobox с помощью ComboboxSelected - PullRequest
1 голос
/ 24 июня 2019

Мой первый вопрос, надеюсь, он сформирован разумно. Я пишу графический интерфейс Python tkinter, который будет отображать различные типы данных в соответствии с запросом в ComboBox. Пользователь выберет запись, и диаграмма mapplotlib обновится. Я давний программист, но все еще изучаю базовые Python и объектно-ориентированные подходы.

Боюсь, я не понимаю некоторые основы. Я связал Combobox с функцией, и она отлично работает, но многие примеры в Интернете включают просто «Я здесь». напечатать заявление в этой функции. Но выбор в выпадающем списке повлияет на несколько вещей. Я должен иметь логику неправильно; Я не могу понять, как отформатировать вызов лямбда-функции для передачи диаграммы и виджетов и тому подобного в функцию обратного вызова. Но, кроме того, я не могу себе представить, чтобы основная логика программы хранилась в функции обратного вызова. Но если я сделаю что-то простое в функции обратного вызова, например, сохраню выбор в переменной, мне нужно будет заставить программу выполнять действия даже вне выбора Combobox, что кажется противоречащим стилю, управляемому событиями.

Комбо-бокс работает, и я могу напечатать выделение. Я рассмотрел повторные вызовы time.sleep () или тому подобное, чтобы почувствовать изменяющуюся переменную, но это кажется плохой формой. Я пытался передать класс для обратного вызова, но не знаю формат. Я экспериментировал с combobox.after, но это не кажется подходящим.

from assign_choices import WidgetChoices

def make_chart_page(nb, chartPage, wc, product_choice):
    comboValues = []                                        
    # Get names for entry into Combobox.  This will depend upon the product.
    Get_Combo_Entries(wc)
    for i in range(len(wc.varList)):
        comboValues.append(wc.varList[i][0])
    # Add the chooser
    comboChart = ttk.Combobox(labelFrameChart, values=comboValues, width=25)
    comboChart.pack(anchor="w", padx=5)
    comboChart.current(0)
#    comboChart.bind("<<ComboboxSelected>>", callback)
#    data={"one": 1, "two": 2}
    data = wc 
    comboChart.bind("<<ComboboxSelected>>", lambda event, arg=data: callback(event, arg))

def callback(eventObject, arg):
    a_c = eventObject.widget.get()
    print("ACTIVE CHART      " + a_c)
    arg.active_chart = a_c


class WidgetChoices():
    def __init__(self):
        self.active_product = "POTATOES"
        self.active_chart = "Producers"
        self.active_map = "POTATOES"
        self.varList = []

Этот код находится в середине цикла, я не думаю, что исправление конкретной ошибки было бы полезно. Вместо этого, как мне: 1) сохранить выбор Combobox в классе wc, а затем попросить основную подпрограмму обновить диаграмму, или 2) при необходимости передать все необходимое функции обратного вызова и обновить диаграмму?

Спасибо за вашу помощь, Randy

1 Ответ

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

Есть шанс, что сейчас я прояснил ситуацию, получив дополнительную информацию и помощь от Х. Йика в ответ на другой вопрос.Следующее успешно передает аргументы и обновляет атрибут диаграммы в модуле по мере необходимости.Следующее является автономным, но содержит решение.

# -*- coding: utf-8 -*-
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,
                                               NavigationToolbar2TkAgg)
from matplotlib.figure import Figure

def make_chart_page(nb, chartPage):
    global canvas
    labelFrameChart = tk.LabelFrame(chartPage, text="Chart control:")
    labelFrameChart.pack(side="left", fill="y", padx=5, pady=5)
    comboChart = ttk.Combobox(labelFrameChart, values=["Foos", "Bars", "Widgets"], width=25)
    comboChart.pack(anchor="w", padx=5)
    f = Figure(figsize=(7,5), dpi=100)
    a = f.add_subplot(111)
    canvas = FigureCanvasTkAgg(f, chartPage)
    canvas.show()
    canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
    canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    data = [ "ZERO", a ]
    comboChart.bind("<<ComboboxSelected>>", lambda event, args=data: callback(event, args))

    tester(a)

def tester(a):
    a.set_xlabel("XAXIS RESET BY TESTER")

def Update_Chart(combo, var0, chart):
    print ("Combobox choice is: ", combo)
    print ("Args[0] is: ", var0)
    chart.set_xlabel("Xaxis reset by Update_Chart")
    canvas.draw()

def callback(eventObject, args):
    Update_Chart(eventObject.widget.get(), args[0], args[1])

def demo():
    root = tk.Tk()
    nb = ttk.Notebook(root)
    chartPage = ttk.Frame(nb)

    make_chart_page(nb, chartPage)

    nb.add(chartPage, text='Charts')
    nb.pack(expand=1, fill="both")

    root.mainloop()

if __name__ == "__main__":
    demo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...