如何在画布上绘制网格然后提示用户输入数据?

问题描述 投票:0回答:1

我正在学习如何使用Anaconda,因为我想要统计功能。但是,我想用tkinter在画布上完成所有工作和数据输入。最终,绘制正态分布。我不确定如何在画布上绘制网格,然后提示用户将数据输入到四个单元格中,然后在画布上处理所有数据。我希望这最终成为一个独立的计划。

import tkinter as tk
import numpy
import math

def fishers():
    cell_a = input("Enter Cell A value: ")
    cell_b = input("Enter Cell B value: ")
    cell_c = input("Enter Cell C value: ")
    cell_d = input("Enter Cell D value: ")
cell_a = float(cell_a)
cell_b = float(cell_b)
cell_c = float(cell_c)
cell_d = float(cell_d)
fenum = math.factorial(cell_a+cell_b)*math.factorial(cell_c+cell_d)*
math.factorial(cell_a+cell_c)*math.factorial(cell_b+cell_d)
feden = 
math.factorial(cell_a)*math.factorial(cell_b)*math.factorial(cell_c)*
math.factorial(cell_d)*math.factorial(cell_a+cell_b+cell_c+cell_d)
fe = fenum/feden
print ("Fishers Exact: =\t {:>8.4f}\n".format(fe))
#This is test code to see if I can write into the canvas        
self.fishers.canvas.create_text(100,10,fill="darkblue",font="Times 20 
italic bold", text="We will enter the data here.")

class Window(tk.Frame):

 def __init__(self, master=None):
    super().__init__(master)
    self.master = master
    self.main_window()
    self.widgets()

# All main window parameters go here
 def main_window(self):
    self.master.title("Quick-Statistics Calculator")
    self.master.geometry("1000x800")
    self.pack()

 def widgets(self):
    main_menu = tk.Menu(self.master, tearoff=0)
    self.master.config(menu=main_menu)

    # Create File Menu and Drop Down
    file = tk.Menu(main_menu, tearoff=0)
    file.add_command(label="Save")
    file.add_separator()
    file.add_command(label="Exit", command=exit)
    main_menu.add_cascade(label="File", menu=file)

    # Create Edit Menu and Drop Down
    edit = tk.Menu(main_menu, tearoff=0)
    edit.add_command(label="Undo")
    main_menu.add_cascade(label="Edit", menu=edit)

    #Create Means Analysis Menu and Drop Down
    means = tk.Menu(main_menu,tearoff=0)
    means.add_command(label="Group t")
    means.add_command(label="Paired t")
    means.add_separator()
    means.add_command(label="ANOVA")
    means.add_separator()
    means.add_command(label="Mann-Whitney U")
    means.add_command(label="Wilcoxon rank sum")
    main_menu.add_cascade(label="Means", menu=means)

    #Create Chi-square Analysis Menus and Drop Down
    chi = tk.Menu(main_menu, tearoff=0)
    chi.add_command(label="Chi-Square 2x2 table")
    chi.add_command(label="Chi-Square for larger table")
    chi.add_separator()
    chi.add_command(label="McNemar's Test")
    chi.add_command(label="Fisher's Exact", command=fishers)
    main_menu.add_cascade(label="Tables", menu=chi)

    #Create Help Menu
    help = tk.Menu(main_menu, tearoff=0)
    help.add_command(label="Means Analysis")
    help.add_command(label="Chi-Square Analysis")
    main_menu.add_cascade(label="Help",menu=help)

main = tk.Tk()
comm_prog = Window(master=main)
main.mainloop()
python canvas tkinter
1个回答
0
投票

您可以使用Toplevel()创建带有Entry()Button()的窗口来获取值。

当您单击按钮OK然后它使用您的代码来计算某些东西并将文本放在画布上。

enter image description here

import tkinter as tk
import numpy
import math

class Window(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        # self.master = master #super/Frame will do it 
        self.main_window()
        self.widgets()

    # All main window parameters go here
    def main_window(self):
        self.master.title("Quick-Statistics Calculator")
        self.master.geometry("500x400")
        self.pack()

    def widgets(self):
        main_menu = tk.Menu(self.master, tearoff=0)
        self.master.config(menu=main_menu)

        # Create File Menu and Drop Down
        file = tk.Menu(main_menu, tearoff=0)
        file.add_command(label="Save")
        file.add_separator()
        file.add_command(label="Exit", command=exit)
        main_menu.add_cascade(label="File", menu=file)

        # Create Edit Menu and Drop Down
        edit = tk.Menu(main_menu, tearoff=0)
        edit.add_command(label="Undo")
        main_menu.add_cascade(label="Edit", menu=edit)

        #Create Means Analysis Menu and Drop Down
        means = tk.Menu(main_menu,tearoff=0)
        means.add_command(label="Group t")
        means.add_command(label="Paired t")
        means.add_separator()
        means.add_command(label="ANOVA")
        means.add_separator()
        means.add_command(label="Mann-Whitney U")
        means.add_command(label="Wilcoxon rank sum")
        main_menu.add_cascade(label="Means", menu=means)

        #Create Chi-square Analysis Menus and Drop Down
        chi = tk.Menu(main_menu, tearoff=0)
        chi.add_command(label="Chi-Square 2x2 table")
        chi.add_command(label="Chi-Square for larger table")
        chi.add_separator()
        chi.add_command(label="McNemar's Test")
        chi.add_command(label="Fisher's Exact", command=self.window_fishers)
        main_menu.add_cascade(label="Tables", menu=chi)

        #Create Help Menu
        help = tk.Menu(main_menu, tearoff=0)
        help.add_command(label="Means Analysis")
        help.add_command(label="Chi-Square Analysis")
        main_menu.add_cascade(label="Help",menu=help)

        self.canvas = tk.Canvas(self, width=500, height=400)
        self.canvas.pack(fill='both', expand=True)

    def window_fishers(self):
        self.win = tk.Toplevel(self)

        tk.Label(self.win, text="Enter Cell A value: ").grid(row=0, column=0)
        tk.Label(self.win, text="Enter Cell B value: ").grid(row=1, column=0)
        tk.Label(self.win, text="Enter Cell C value: ").grid(row=2, column=0)
        tk.Label(self.win, text="Enter Cell D value: ").grid(row=3, column=0)

        self.entry_a = tk.Entry(self.win)
        self.entry_a.grid(row=0, column=1)
        self.entry_b = tk.Entry(self.win)
        self.entry_b.grid(row=1, column=1)
        self.entry_c = tk.Entry(self.win)
        self.entry_c.grid(row=2, column=1)
        self.entry_d = tk.Entry(self.win)
        self.entry_d.grid(row=3, column=1)

        tk.Button(self.win, text='Cancel', command=self.win.destroy).grid(row=4, column=0)
        tk.Button(self.win, text='OK', command=self.get_fishers).grid(row=4, column=1)

    def get_fishers(self):

        cell_a = float(self.entry_a.get())
        cell_b = float(self.entry_b.get())
        cell_c = float(self.entry_c.get())
        cell_d = float(self.entry_d.get())

        fenum = math.factorial(cell_a+cell_b)*math.factorial(cell_c+cell_d)*math.factorial(cell_a+cell_c)*math.factorial(cell_b+cell_d)
        feden = math.factorial(cell_a)*math.factorial(cell_b)*math.factorial(cell_c)*math.factorial(cell_d)*math.factorial(cell_a+cell_b+cell_c+cell_d)
        fe = fenum/feden
        text = "Fishers Exact: =\t {:>8.4f}\n".format(fe)
        #This is test code to see if I can write into the canvas        
        self.canvas.create_text(250, 100, fill="darkblue", font="Times 20 italic bold", text=text)

        # close after entry.get()
        self.win.destroy()

main = tk.Tk()
app = Window(main)
main.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.