2017-12-31 223 views
0

統計機能が必要なので、私はアナコンダの使い方を学んでいます。しかし、tkinterを使ってキャンバス上で作業とデータ入力をすべて行いたいと思います。結局、正規分布を引きます。私はキャンバス上にグリッドを描画し、4つのセルにデータを入力してキャンバス上ですべてのデータを処理するようにユーザーに促す方法を確信しています。私はこれが最終的にスタンドアローンのプログラムになることを望みます。キャンバスにグリッドを描画して、データの入力を促す方法は?

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() 
+0

は、2個の関連タグを追加しました。 はおそらくMCVEを使用して、あなたが '入力()'データを取得するために使用する場合、それは奇妙に見えるその後、任意のGUIを使用する場合は、タイトル – Nae

+0

以上の冗長部分を失う可能性があります。すべてのGUIにはウィンドウ内のデータを取得するウィジェットがあります。 – Nae

+0

を改善 – furas

答えて

0

あなたは値を取得するEntry()Button()でウィンドウを作成するためにToplevel()を使用することができます。

ボタン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() 
関連する問題