我的第一个问题,我希望它是合理的。我正在编写一个Python Tkinter GUI,该GUI将根据Combobox中的要求来绘制不同类型的数据。用户将选择一个条目,Mapplotlib图将更新。我是一个长期的程序员,但仍在学习基本的Python和面向对象的方法。
我担心我不了解一些基础知识。我已经绑定了一个函数的Combobox,并且效果很好,但是网络上的许多示例都包括一个"我在这里"。在该功能中打印语句。但是组合中的选择会影响几件事。我必须逻辑错误;我不知道如何格式化lambda函数调用以传递图表和小部件之类的回调功能。但是,我无法想象将主要程序逻辑埋在回调函数中。但是,如果我在回调函数中做一些简单的事情,例如将选择存储在变量中,那么我需要让该程序甚至在Combobox选择之外采取行动,这似乎与事件驱动的样式相反。
Combobox的作品,我可以打印选择。我已经考虑了随着时间的推移的重复呼叫。Sleep((或类似感知变量的变化,但这似乎很糟糕。我尝试通过课程来回调,但不知道格式。我已经尝试了combobox。但是,这似乎不合适。
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(在必要时,请传递回调功能所需的所有内容,并更新图表?
谢谢您的帮助,兰迪
现在有可能对此感到明确,并从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()