通过文本输入和按钮更新直方图(kivy)



我想通过在文本输入中输入多个箱来更新直方图的箱。在文本框中输入值后,单击按钮后应更新直方图。

我的代码如下:

import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from kivy.app import App
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvas, NavigationToolbar2Kivy
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
import matplotlib.pyplot as plt
import csv
with open("c:/Users/Niels/Desktop/uranite_23_03_2017.csv", 'rb') as f:
    reader = csv.reader(f, delimiter=';')
    data = []
    for column in reader:
        data.append(column[1])
    results = data
    results = [int(i) for i in results]
bins = 200
plt.hist(results, bins=bins)
plt.title("Histogram")
plt.xlabel("Value")
plt.ylabel("Frequency")
fig = plt.gcf()
canvas = fig.canvas
def callback(self):
    global fig, results
    #bins = 50
    plt.hist(results,bins=bins)
    canvas.draw()
class HistogramApp(App):
    title = 'Histogram data'
    def build(self):
        fl = BoxLayout(orientation="vertical")
        self.btn1 = Button(text="Update", height=40, size_hint_y=None)
        self.btn1.bind(on_press=callback)
        self.tekstvak = TextInput(height=30, size_hint_y=None, multiline=False)
        nav1 = NavigationToolbar2Kivy(canvas)
        fl.add_widget(nav1.actionbar)
        fl.add_widget(canvas)
        fl.add_widget(self.tekstvak)
        fl.add_widget(self.btn1)
        return fl
if __name__ == '__main__':
    HistogramApp().run().

回调函数工作正常。如果我在此功能中手动输入箱,直方图将按预期更新。但是我该如何通过在文本输入中输入数字来做到这一点呢?

您需要定义callback,以便它接收箱数作为参数,然后在将 on_press 事件绑定到按钮时提供 TextInput text 属性。所以,首先,callback

# Callback takes one argument that is the number of bins
def callback(bins):
    global fig, results
    # Clear the plot figure, otherwise you'll end up with multiple plots overlayed
    plt.clf()
    # Convert bins to integer. You may want to use try/except statements to check if bins is convertable to integer and, if not, handle the exception
    bins = int(bins)
    plt.hist(results,bins=bins)
    canvas.draw()

现在直方图应用程序:

class HistogramApp(App):
    title = 'Histogram data'
    def build(self):
        fl = BoxLayout(orientation="vertical")
        self.btn1 = Button(text="Update", height=40, size_hint_y=None)
        self.tekstvak = TextInput(height=30, size_hint_y=None, multiline=False)
        # Bind the on press event after defining self.tekstvak
        # Note the use of lambda so that we can provide our own
        # argument to the callback. The argument is simply the
        # reference to the TextInput instance text property
        self.btn1.bind(on_press=lambda x: callback(self.tekstvak.text))
        nav1 = NavigationToolbar2Kivy(canvas)
        fl.add_widget(nav1.actionbar)
        fl.add_widget(canvas)
        fl.add_widget(self.tekstvak)
        fl.add_widget(self.btn1)
        return fl

您甚至可以将相同的回调绑定到 TextInput 的 on_text_validate 事件。这样,您可以键入箱数,按 输入 就是这样。

self.tekstvak.bind(on_text_validate=lambda x: callback(self.tekstvak.text))

最新更新