ostapdontstop

Untitled

Jul 2nd, 2020
1,208
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import tkinter as tk
  2.  
  3. import matplotlib
  4. matplotlib.use('TkAgg')
  5. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  6. from matplotlib.figure import Figure
  7. import matplotlib.pyplot as plt
  8.  
  9. import random
  10. import gen
  11.  
  12. class GenApp(tk.Frame):
  13.  
  14.     def __init__(self, master, *args, **kwargs):
  15.         tk.Frame.__init__(self, master, *args, **kwargs)
  16.        
  17.         self.master = master
  18.         self.master.title("Графики ГПСЧ")
  19.  
  20.  
  21.         self.gens = [
  22.             gen.lcg(2**32, 1664525, 1013904223, 0),
  23.             gen.mid_square(36149212),
  24.             gen.mid_multi(123456),
  25.             gen.mix_sum(1234567890) ]
  26.         self.names = [
  27.             'Срединные квадраты',
  28.             'Срединные произведения',
  29.             'Метод перемешивания',
  30.             'Линейно конгруэнтный' ]
  31.  
  32.         self.CURRENT = 0
  33.         self.N = 500
  34.  
  35.         self.text_input = tk.StringVar()
  36.  
  37.         self.createPlots();
  38.         self.createTextInput();
  39.         self.createButtons();
  40.  
  41.         self.set_data()
  42.  
  43.     def createPlots(self):
  44.         fig, self.ax = plt.subplots(2,1,sharey=True, tight_layout=True)
  45.         self.canvas = FigureCanvasTkAgg(fig, master=root)
  46.         self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
  47.  
  48.     def createButtons(self):
  49.         frame = tk.Frame()
  50.         frame.pack(side=tk.BOTTOM, pady=5)
  51.         for i,name in enumerate(self.names):
  52.             tk.Button(frame,text=self.names[i], width=22, command=lambda i=i: self.callback(set_gen = i)).grid(row=i//2, column=i%2)
  53.    
  54.     def createTextInput(self):
  55.         frame = tk.Frame()
  56.         tk.Label(frame,text='Длина').pack(side=tk.LEFT, padx=10, pady=5)
  57.         tk.Button(frame,text="OK", command=self.callback, width=4).pack(side=tk.RIGHT, padx=10, pady=5)
  58.         text = tk.Entry(frame,textvariable=self.text_input)
  59.         text.insert(tk.END, str(self.N))
  60.         text.bind('<Return>', self.callback)
  61.         text.focus_set()
  62.         text.pack(side=tk.LEFT, padx=1, pady=5)
  63.         frame.pack(side=tk.BOTTOM, pady=5)
  64.  
  65.  
  66.  
  67.     def callback(self, event = None, set_gen = None):
  68.         try:
  69.             self.N = int(self.text_input.get())
  70.         except ValueError:
  71.             return
  72.         if self.N < 0:
  73.             return
  74.         if set_gen != None:
  75.             self.CURRENT = int(set_gen)
  76.         self.set_data(set_gen)
  77.  
  78.  
  79.     def set_data(self, method = None):
  80.         if method != None:
  81.             self.CURRENT = method
  82.         self.ax[0].clear()
  83.         self.ax[0].set_title('random()')
  84.         self.ax[0].scatter(range(self.N),[random.random() for i in range(self.N)],s=1)
  85.  
  86.         self.ax[1].clear()
  87.         self.ax[1].set_title(self.names[self.CURRENT])
  88.         self.ax[1].scatter(range(self.N),[next(self.gens[self.CURRENT]) for i in range(self.N)],s=1)
  89.         self.canvas.draw()
  90.  
  91.  
  92. if __name__ == '__main__':
  93.     root = tk.Tk()
  94.     GenApp(root).pack(side="top", fill="both", expand=True)
  95.     root.mainloop()
RAW Paste Data