python - 使用 ComboboxSelected 对 tkinter Combobox 选择进行事件驱动管理

标签 python tkinter combobox binding

我的第一个问题,我希望它是合理的。我正在编写一个 Python tkinter GUI,它将根据 ComboBox 中的请求绘制不同类型的数据。用户将选择一个条目,mapplotlib 图表将更新。我是一名资深程序员,但仍在学习基本的 Python 和面向对象方法。

我担心我不明白一些基础知识。我已将组合框绑定(bind)到一个函数,并且工作正常,但网上的许多示例仅包含“我在这里”。该函数中的 print 语句。但组合框中的选择会影响几件事。我一定是逻辑错了;我不知道如何格式化 lambda 函数调用以将图表和小部件等传递给回调函数。但此外,我无法想象将主程序逻辑隐藏在回调函数中。但是,如果我在回调函数中执行一些简单的操作,例如将选择存储在变量中,那么我什至需要让程序在组合框选择之外执行操作,这似乎与事件驱动的风格相反。

组合框可以工作,我可以打印选择。我考虑过重复调用 time.sleep() 或类似的方法来感知变化的变量,但这似乎很糟糕。我尝试过将类传递给回调,但不知道格式。我尝试过组合框.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)将组合框选择存储在类 wc 中,然后要求主例程更新图表,或者 2)如果需要,将所需的所有内容传递给回调函数并让它更新图表? p>

感谢您的帮助, 兰迪

最佳答案

通过 H. Yik 回答另一个问题的更多学习和帮助,我现在可能已经清楚了这一点。以下代码成功传递参数,并根据需要更新模块内图表的属性。以下内容是独立的,但包含解决方案。

# -*- 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()

关于python - 使用 ComboboxSelected 对 tkinter Combobox 选择进行事件驱动管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56742029/

相关文章:

python - 使用 PySpark UDF 时记录工作人员 ID

python - openerp-server 数据库问题

python - 如何在Python中找到mime类型

python - 从 pandas 数据框中指定 x 轴图上的日期

python - 如何用 python Tkinter 隐藏 Windows 控制台?

java - SetAlignment 方法在带有组合框的 FlowLayout 中不起作用

python - 箭头键输入代码在 tkinter 中不起作用

python - Tkinter - 获取比例/ slider 的名称和值

c# - WPF Combobox isEditable 绑定(bind)条目到列表

combobox - 避免 ComboBox 发送不在列表中的值