1+ # tkinter toolkit
2+ from tkinter import *
3+ from tkinter .ttk import *
4+ from tkinter import messagebox
5+
6+ from numpy import random
7+ import matplotlib .pyplot as plt
8+ import seaborn as sns
9+ from scipy .stats import binom
10+ from math import floor
11+ import os
12+
13+ # plt.show()
14+
15+ def value_around (value = 1 , min_value = 0 , max_value = 1 ):
16+ value = min (max_value , value )
17+ value = max (min_value , value )
18+ return value
19+
20+ class Gui_helper_main :
21+ def __init__ (self ):
22+ self .root = Tk ()
23+ self .frame = None
24+ self .frame_index = 0
25+ self .root .geometry ('300x200' )
26+ self .root .title ('Binomial Distribution Simulator' )
27+ self .root .protocol ("WM_DELETE_WINDOW" , self .quit )
28+ # maker info
29+ self .maker_name = Label (self .root , text = "Maker: JingShing" )
30+ self .maker_name .grid (column = 0 , row = 3 , sticky = N + W )
31+
32+ self .frames = [page_module (self )]
33+ self .switch_frame (0 )
34+
35+ def switch_frame (self , index ):
36+ if self .frame is not None :
37+ self .frame .grid_forget ()
38+ self .frame_index = index
39+ self .frame = self .frames [self .frame_index ]
40+ self .frame .grid (column = 0 , row = 0 , sticky = N + W )
41+
42+ def run (self ):
43+ # from threading import Thread
44+ # thread1 = Thread(target=self.frames[0].order_bot)
45+ # thread1.setDaemon(True)
46+ # thread1.start()
47+ self .root .mainloop ()
48+
49+ def quit (self ):
50+ if messagebox .askyesno ('Confirm' ,'Are you sure you want to quit?' ):
51+ self .root .quit ()
52+
53+ class page_module (Frame ):
54+ def __init__ (self , master ):
55+ Frame .__init__ (self , master = master .root )
56+ self .main = master
57+ self .master = master .root
58+ self .last_file_path = None
59+
60+ # display last order
61+ self .last_order = StringVar ()
62+ self .last_order .set ('Binomial Distribution Simulator' )
63+ self .last_order = Label (self , textvariable = self .last_order )
64+ self .last_order .grid (column = 0 , row = 0 , sticky = N + W )
65+
66+ # input box
67+ self .n_label = Label (self , text = 'n(int):' )
68+ self .n_label .grid (column = 0 , row = 1 )
69+ self .n_entry = Entry (self )
70+ self .n_entry .grid (column = 1 , row = 1 )
71+ self .p_label = Label (self , text = 'p(float):' )
72+ self .p_label .grid (column = 0 , row = 3 )
73+ self .p_entry = Entry (self )
74+ self .p_entry .grid (column = 1 , row = 3 )
75+ self .size_label = Label (self , text = 'size(int):' )
76+ self .size_label .grid (column = 0 , row = 5 )
77+ self .size_entry = Entry (self )
78+ self .size_entry .grid (column = 1 , row = 5 )
79+ self .target_label = Label (self , text = 'target(int):' )
80+ self .target_label .grid (column = 0 , row = 7 )
81+ self .target_entry = Entry (self )
82+ self .target_entry .grid (column = 1 , row = 7 )
83+
84+ # Button
85+ self .order_button = Button (self , text = 'save png' , command = self .save_png )
86+ self .order_button .grid (column = 0 , row = 9 )
87+ self .order_button = Button (self , text = 'show table' , command = self .show_table )
88+ self .order_button .grid (column = 1 , row = 9 )
89+
90+ def update_string_var (self ):
91+ self .last_order .set (self .order_bot .last_order )
92+
93+ def save_png (self ):
94+ n = int (self .n_entry .get ())
95+ p = value_around (value = float (self .p_entry .get ()), min_value = 0 , max_value = 1 )
96+ size = int (self .size_entry .get ())
97+ target = int (self .target_entry .get ())
98+ # mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
99+ mean = binom .stats (n , p , moments = 'm' )
100+ fixed_mean = floor ((n + 1 )* p )
101+ print ("Mean(np):" , mean )
102+ print ("fixed mean(floor((n+1)*p)):" , fixed_mean )
103+ print ("Original Probability of " + str (target )+ ":" , binom .pmf (target , n , p ))
104+ print ("% Probability of " + str (target )+ ":" + str (binom .pmf (target , n , p )* 100 ) + '%' )
105+ # binom.pmf(k, n, p)
106+ # binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)
107+ sns .displot (random .binomial (n = n , p = p , size = size ))
108+ plt .title ("Binomial Simulation w/ n = " + str (n )+ ", p = " + str (p ))
109+ plt .tight_layout ()
110+
111+ output_dir = 'output'
112+ output_file_name = 'n_' + str (n ) + '_' + 'p_' + str (p ).replace ('.' , '' ) + '_' + 'plot.png'
113+ # output_file_name = 'plot.png'
114+ output_path = os .path .join (output_dir , output_file_name )
115+
116+ # output_path = output_file_name
117+ plt .savefig (output_path , dpi = 300 )
118+
119+ def show_table (self ):
120+ n = int (self .n_entry .get ())
121+ p = value_around (value = float (self .p_entry .get ()), min_value = 0 , max_value = 1 )
122+ size = int (self .size_entry .get ())
123+ target = int (self .target_entry .get ())
124+ # mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
125+ mean = binom .stats (n , p , moments = 'm' )
126+ fixed_mean = floor ((n + 1 )* p )
127+ print ("Mean(np):" , mean )
128+ print ("fixed mean(floor((n+1)*p)):" , fixed_mean )
129+ print ("Original Probability of " + str (target )+ ":" , binom .pmf (target , n , p ))
130+ print ("% Probability of " + str (target )+ ":" + str (binom .pmf (target , n , p )* 100 ) + '%' )
131+ # binom.pmf(k, n, p)
132+ # binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)
133+ sns .displot (random .binomial (n = n , p = p , size = size ))
134+ plt .title ("Binomial Simulation w/ n = " + str (n )+ ", p = " + str (p ))
135+ plt .tight_layout ()
136+ plt .show ()
137+
138+ if __name__ == '__main__' :
139+ main = Gui_helper_main ()
140+ main .run ()
0 commit comments