Tkinter 散点图

Tkinter scatter plot

我正在尝试使用 tkinter 创建一个 GUI 应用程序,要求用户输入 x 和 y 值,完成后单击生成散点图的按钮。当我 运行 代码没有任何反应时,我没有收到任何错误消息,也没有 window 弹出,我不确定出了什么问题。这是我的代码:

import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *

class mclass:
    mylist = []
    mylist1 = []

    def __init__(self, window):
        self.window = window
        self.box1 = Entry(window)
        self.button1 = Button(window, text="enter", command=lambda:     get_data1(mylist), width=5)
        self.button1.grid(row=0, column=2)
        self.box1.pack()
        self.button1.pack()
        self.box2 = Entry(window)
        self.button2 = Button(window, text="enter", command=lambda: get_data2(mylist1), width=5)
        self.button2.grid(row=1, column=2)
        self.box2.pack()
        self.button2.pack()
        self.box3 = Entry(window)
        self.button3 = Button(window, text="Finish & Plot", command=self.plot)
        self.box3.pack()
        self.button3.pack()


        def get_data1(l):
            l.append(self.box1.get())
            print(l)

        def get_data2(l1):
            l1.append(self.box2.get())
            print(l1)

        var1 = StringVar()
        var1.set("X Values:")
        label1 = Label(window, textvariable=var1, height=2)
        label1.grid(row=0, column=0)


       ID1 = StringVar()
       self.box1 = Entry(window, bd=4, textvariable=ID1)
       self.box1.grid(row=0, column=1)

       var2 = StringVar()
       var2.set("Y Values:")
       label2 = Label(window, textvariable=var2, height=2)
       label2.grid(row=1, column=0)

       ID2 = StringVar()
       self.box2 = Entry(window, bd=4, textvariable=ID2)
       self.box2.grid(row=1, column=1)


    def plot(self):
        x = np.array(mylist)
        v = np.array(mylist1)

        fig = Figure(figsize=(6, 6))
        a = fig.add_subplot(111)
        a.scatter(v, x, color='red')


        a.set_title ("Scatter Plot)", fontsize=16)
        a.set_ylabel("Y", fontsize=14)
        a.set_xlabel("X", fontsize=14)

        canvas = FigureCanvasTkAgg(fig, master=self.window)
        canvas.get_tk_widget().pack()
        canvas.draw()

window = Tk()
start = mclass(window)
window.mainloop()

如果有人能帮助我解决我的错误,我将不胜感激,谢谢!

老实说,您的原始示例中有很多内容不正确,我收到了很多错误消息。其中大部分是您同时使用 pack 和 grid,这在一帧内是不可能的。这是您的代码的工作版本

import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *

class mclass:

    def __init__(self, window):
        self.mylist = []
        self.mylist1 = []

        self.window = window

        self.button3 = Button(window, text="Finish & Plot", command=self.plot)
        self.button3.pack()

        var1 = StringVar()
        var1.set("X Values:")
        label1 = Label(window, textvariable=var1, height=2)
        label1.pack()


        ID1 = StringVar()
        self.box1 = Entry(window, bd=4, textvariable=ID1)
        self.box1.pack()

        var2 = StringVar()
        var2.set("Y Values:")
        label2 = Label(window, textvariable=var2, height=2)
        label2.pack()

        ID2 = StringVar()
        self.box2 = Entry(window, bd=4, textvariable=ID2)
        self.box2.pack()

        self.fig = Figure(figsize=(6, 6))
        self.a = self.fig.add_subplot(111)

        self.canvas = FigureCanvasTkAgg(self.fig, master=self.window)
        self.canvas.get_tk_widget().pack()

    def read_inputs(self):
        x_input = self.box1.get()
        y_input = self.box2.get()


        def convert_to_float_list(x_in):
            x_input_list = x_in.split(',')
            x_floats = [float(x) for x in x_input_list]
            return x_floats


        x_array = np.array(convert_to_float_list(x_input))
        y_array = np.array(convert_to_float_list(y_input))

        return x_array,y_array


    def plot(self):
        self.a.cla()
        x,v = self.read_inputs()
        self.a.scatter(x, v, color='red')

        self.a.set_title ("Scatter Plot)", fontsize=16)
        self.a.set_ylabel("Y", fontsize=14)
        self.a.set_xlabel("X", fontsize=14)

        self.canvas.draw()

window = Tk()
start = mclass(window)
window.mainloop()

我做过的事情:

  • 我将所有 .grid 调用更改为 .pack
  • 我删除了不需要的条目。
  • 我将图形的定义移到了 init 方法中,这样 没有生成多个数字
  • 我删除了所有按钮,但删除了完成和绘图按钮。在绘图之前读取这些值
  • 输入是字符串,在绘图之前必须转换为浮点数列表(或 np.arrays)。代码现在假定逗号分隔的浮点数作为 x 和 y entry
  • 中的输入