【问题标题】:Event-driven management of tkinter Combobox selection with ComboboxSelected使用 ComboboxSelected 对 tkinter 组合框选择进行事件驱动管理
【发布时间】:2019-11-06 13:59:16
【问题描述】:

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

恐怕我不懂一些基础知识。我已经将 Combobox 绑定到一个函数并且它工作正常,但是 Web 上的许多示例仅包含“我在这里”。在该函数中打印语句。但是组合框中的选择会影响几件事。我一定是逻辑错了;我不知道如何格式化 lambda 函数调用以将图表和小部件等传递给回调函数。但此外,我无法想象将主程序逻辑埋在回调函数中。但是如果我在回调函数中做一些简单的事情,比如将选择存储在一个变量中,那么我需要让程序在组合框选择之外采取行动,这似乎与事件驱动风格背道而驰。

组合框有效,我可以打印选择。我考虑过重复调用 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) 如有必要,将所需的所有内容传递给回调函数并让它更新图表?

感谢您的帮助, 兰迪

【问题讨论】:

    标签: python tkinter combobox binding


    【解决方案1】:

    现在我有机会清楚这一点,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()
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      相关资源
      最近更新 更多