【问题标题】:Tkinter gui graphTkinter gui图
【发布时间】:2017-11-27 04:36:14
【问题描述】:

我正在寻找一些关于在哪里查找有关在 tkinter 中为我已经在 python 中编程的图形创建 gui 的信息的指导。我想做的是构建一个可以导入 csv 数据的 gui,然后用户将单击一个按钮,该按钮将显示他们想要的图形类型。现在我有 4 个在 python 中创建的图表,我不确定如何将它们转换为 tkinter 格式。我对 python 和 tkinter 很陌生。任何指导将不胜感激。 这是迄今为止我为 tkinter 编写的代码。

import tkinter as tk
from tkinter.filedialog import askopenfilename
from tkinter import *
import pandas as pd
import subprocess
import webbrowser
import sys

def import_csv_data():
    global v
    csv_file_path = askopenfilename()
    print(csv_file_path)
    v.set(csv_file_path)
    df = pd.read_csv(csv_file_path)

root = tk.Tk()
tk.Label(root, text='File Path').grid(row=0, column=0)
v = tk.StringVar()
entry = tk.Entry(root, textvariable=v).grid(row=0, column=1)
tk.Button(root, text='Browse Data Set',command=import_csv_data).grid(row=1, column=0)
tk.Button(root, text='Close',command=root.destroy).grid(row=1, column=1)

tk.Button(root, text='Graph 1', command=doNothing).grid(row=3, column=0)
tk.Button(root, text='Graph 2', command=doNothing).grid(row=3, column=1)
tk.Button(root, text='Graph 3', command=doNothing).grid(row=3, column=2)
tk.Button(root, text='Graph 4', command=doNothing).grid(row=3, column=3)



def doNothing():
    print("nothing")

def create_window():
    window = tk.Tk()    


menu =  Menu(root)
root.config(menu=menu)
subMenu = Menu(menu)
menu.add_cascade(label="File",menu=subMenu)
subMenu.add_command(label="New", command=create_window)
subMenu.add_command(label="Open", command=doNothing)
subMenu.add_command(label="Restart", command=doNothing)
subMenu.add_command(label="Exit", command=doNothing)
editMenu = Menu(menu)
menu.add_cascade(label = "Help", menu=editMenu)
editMenu.add_command(label="Help", command=doNothing)



root.mainloop()

这是我为其中一张图表编写的代码

import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('csv.data')

# Indicated your x values and y values. 
x = df["X Data"]
y1 = df["Y1 Data"]
y2 = df["Y2 Data"]
z = df["Y3 Data"]
y_pos = np.arange(len(x))


lns1 = plt.bar(y_pos,z)
plt.ylabel('Bar Graph')
plt.xlabel('Date')


plt.twinx()
lns2 = plt.plot(y_pos,y1,'r-',linewidth=2.5)
lns3 = plt.plot(y_pos,y2,color='orange',linewidth=2.5)
plt.ylabel('Line Data')
plt.xticks(y_pos, x)
plt.xlabel('X axis')
plt.title('Graph 1')

plt.legend([lns1, lns2[0], lns3[0]],["Bar", "Line 1", "Line 2"], loc="upper right")

plt.draw()
plt.show()

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案1】:

    这是一种方法(您没有说要在 tkinter 窗口中显示图形,所以我假设图形将显示在单独的 matplotlib 窗口中):

    1. 首先,将图形的代码放入函数中,以便调用它们 当你想要的时候。我将提供的代码放在一个名为的函数中 display_graph,它将csv 文件作为参数。我那时 将该模块保存为graph1.py

    这里是graph1.py 代码:

    import matplotlib.pyplot as plt; plt.rcdefaults()
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    # Put the code in a function so you cal call it later
    def display_graph(data):
        df = pd.read_csv(data)
    
        # Indicated your x values and y values. 
        x = df["X Data"]
        y1 = df["Y1 Data"]
        y2 = df["Y2 Data"]
        z = df["Y3 Data"]
        y_pos = np.arange(len(x))
    
        lns1 = plt.bar(y_pos,z)
        plt.ylabel('Bar Graph')
        plt.xlabel('Date')
    
        plt.twinx()
        lns2 = plt.plot(y_pos,y1,'r-',linewidth=2.5)
        lns3 = plt.plot(y_pos,y2,color='orange',linewidth=2.5)
        plt.ylabel('Line Data')
        plt.xticks(y_pos, x)
        plt.xlabel('X axis')
        plt.title('Graph 1')
    
        plt.legend([lns1, lns2[0], lns3[0]],["Bar", "Line 1", "Line 2"], loc="upper right")
    
        plt.draw()
        plt.show()
    
    #display_graph('data.csv')
    
    1. 然后将graph1.py 模块导入到 tkinter gui 文件中,使用 import graph1
    2. 为按钮命令定义一个函数。我在其中定义了graph_1 并从graph1 模块中调用了display_graph
    3. 最后,我将“图表 1”按钮的命令更改为 graph_1

    这是 tkinter gui 的代码:

    注意:我使用的是 python 2.7,所以我更改了一些 import 语句,您必须将它们改回 python 3 等效项。 p>

    #import Tkinter as tk
    #from tkFileDialog import askopenfilename
    #from Tkinter import *
    import tkinter as tk
    from tkinter.filedialog import askopenfilename
    from tkinter import *
    import pandas as pd
    import subprocess
    import webbrowser
    import sys
    
    import graph1 # import the graph1 module
    
    def import_csv_data():
        global v
        csv_file_path = askopenfilename()
        print(csv_file_path)
        v.set(csv_file_path)
        df = pd.read_csv(csv_file_path)
    
    # Define the functions before calling them
    def doNothing():
        print("nothing")
    
    def create_window():
        window = tk.Tk() 
    
    # Define a function for 'Graph 1' button. This just calls the 'display_graph' function from 
    # the 'graph1' module.
    ## You could avoid defining this function and use lambda and graph1.display_graph(v.get())
    ## in the 'Graph 1' button command but I prefer it this way.
    def graph_1():
        graph1.display_graph(v.get())
    
    
    root = tk.Tk()
    tk.Label(root, text='File Path').grid(row=0, column=0)
    v = tk.StringVar()
    entry = tk.Entry(root, textvariable=v).grid(row=0, column=1)
    tk.Button(root, text='Browse Data Set',command=import_csv_data).grid(row=1, column=0)
    tk.Button(root, text='Close',command=root.destroy).grid(row=1, column=1)
    
    tk.Button(root, text='Graph 1', command=graph_1).grid(row=3, column=0) # Call the graph_1 function
    tk.Button(root, text='Graph 2', command=doNothing).grid(row=3, column=1)
    tk.Button(root, text='Graph 3', command=doNothing).grid(row=3, column=2)
    tk.Button(root, text='Graph 4', command=doNothing).grid(row=3, column=3)
    
    
    menu =  Menu(root)
    root.config(menu=menu)
    subMenu = Menu(menu)
    menu.add_cascade(label="File",menu=subMenu)
    subMenu.add_command(label="New", command=create_window)
    subMenu.add_command(label="Open", command=doNothing)
    subMenu.add_command(label="Restart", command=doNothing)
    subMenu.add_command(label="Exit", command=doNothing)
    editMenu = Menu(menu)
    menu.add_cascade(label = "Help", menu=editMenu)
    editMenu.add_command(label="Help", command=doNothing)
    
    root.mainloop()
    

    这是我运行 gui 脚本、浏览 csv 文件并单击“图表 1”按钮时的输出:

    示例 csv 文件

    X Data,Y1 Data,Y2 Data,Y3 Data
    0,5,15,100
    2,6,30,125
    4,4,20,122
    6,10,45,128
    8,15,10,79
    10,14,10,84
    13,20,12,99
    14,6,13,56
    16,4,18,67
    18,8,25,83
    20,9,12,91
    

    Tkinter 界面

    Matplotlib 图

    【讨论】:

      【解决方案2】:
      import tkinter
      
      from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,NavigationToolbar2Tk)
      # Implement the default Matplotlib key bindings.
      from matplotlib.backend_bases import key_press_handler
      from matplotlib.figure import Figure
      
      import numpy as np
      
      
      root = tkinter.Tk()
      root.wm_title("Embedding in Tk")
      
      fig = Figure(figsize=(5, 4), dpi=100)
      t = np.arange(0, 3, .01)
      fig.add_subplot(111).plot(t, 2 * np.sin(2 * np.pi * t))
      
      canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
      canvas.draw()
      
      toolbar = NavigationToolbar2Tk(canvas, root)
      toolbar.update()
      
      
      def on_key_press(event):
          print("you pressed {}".format(event.key))
          key_press_handler(event, canvas, toolbar)
      
      
      canvas.mpl_connect("key_press_event", on_key_press)
      
      button = tkinter.Button(master=root, text="Quit", command=root.quit)
      
      # Packing order is important. Widgets are processed sequentially and if there
      # is no space left, because the window is too small, they are not displayed.
      # The canvas is rather flexible in its size, so we pack it last which makes
      # sure the UI controls are displayed as long as possible.
      button.pack(side=tkinter.BOTTOM)
      canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
      
      tkinter.mainloop()
      
      
      
      #This is the basic framework type code that helped me. You can use it according to         your code.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-26
        • 2015-01-18
        • 2021-12-04
        • 2017-10-16
        • 1970-01-01
        • 2017-12-04
        • 2014-09-26
        • 2021-09-01
        相关资源
        最近更新 更多