使用ComboboxSelected对tkinter Combobox选择的事件驱动管理

2024-03-28 13:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

恐怕我不懂一些基本知识。我已经将Combobox绑定到一个函数,它工作得很好,但是Web上的许多示例只在该函数中包含一个“我在这里”print语句。但是组合框中的一个选择会影响一些事情。我一定是逻辑错误了;我不知道如何格式化lambda函数调用来将图表和小部件等传递给回调函数。但是,我无法想象在回调函数中隐藏主程序逻辑。但是如果我在回调函数中做了一些简单的事情,比如将选择存储在变量中,那么我甚至需要让程序在组合框选择之外执行操作,这似乎与事件驱动风格背道而驰。你知道吗

组合框工作,我可以打印选择。我考虑过多次打电话给时间。睡眠()或诸如此类的方法来感知一个变化的变量,但这种形式似乎不好。我试过传递一个类给回调,但不知道它的格式。我试过组合框.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)如果需要,将所需的一切传递给回调函数并让它更新图表?你知道吗

谢谢你的帮助, 兰迪


Tags: 函数selfdatadefcallbackchart图表arg
1条回答
网友
1楼 · 发布于 2024-03-28 13:36:29

现在我有机会清楚地认识到这一点,在回答另一个问题时,叶浩给予了我更多的学习和帮助。以下命令成功地传递参数,并根据需要更新模块中图表的属性。以下是独立的,但捕获了解决方案。你知道吗

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

相关问题 更多 >