'Exploring Normalizations' : ExploringNormalizations, 'Different Scales' : DifferentScales, 'Pyplot Box Plot' : PyplotBoxPlot, 'Pyplot ggplot Style Sheet' : PyplotGGPlotSytleSheet, 'Pyplot Line Poly Collection' : PyplotLinePolyCollection, 'Pyplot Line Styles' : PyplotLineStyles, 'Pyplot Scatter With Legend' :PyplotScatterWithLegend, 'Artist Customized Box Plots' : PyplotArtistBoxPlots, 'Artist Customized Box Plots 2' : ArtistBoxplot2, 'Pyplot Histogram' : PyplotHistogram} sg.ChangeLookAndFeel('LightGreen') figure_w, figure_h = 650, 650 # define the form layout listbox_values = [key for key in fig_dict.keys()] col_listbox = [[sg.Listbox(values=listbox_values, change_submits=True, size=(28, len(listbox_values)), key='func')], [sg.T(' ' * 12), sg.Exit(size=(5, 2))]] layout = [[sg.Text('Matplotlib Plot Test', font=('current 18'))], [sg.Column(col_listbox, pad=(5, (3, 330))), sg.Canvas(size=(figure_w, figure_h), key='canvas') , sg.Multiline(size=(70, 35), pad=(5, (3, 90)), key='multiline')],] # create the form and show it without the plot window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', grab_anywhere=False).Layout(layout) window.Finalize() canvas_elem = window.FindElement('canvas') multiline_elem= window.FindElement('multiline') while True: event, values = window.Read() print(event) # show it all again and get buttons if event in (None, 'Exit'): break
dac1 = int(dummydac1 / 255.0 * 4095) dac2 = int(dummydac2 / 255.0 * 4095) v = f'4 {dac1} {ms} {dac2} {ms}' #print(v) try: window.write_event_value('-THREAD-', v) except: pass time.sleep(0.1) fig = plt.figure(figsize=(6, 4)) figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds ax = fig.add_subplot(111) layout = [[sg.Canvas(size=(figure_w, figure_h), key='-CANVAS-')], [sg.Text('IPアドレス'), sg.InputText(size=(15, 1), key='-IPADDRESS-')], [sg.Button('OPEN'), sg.Text('未接続', size=(10, 1), key='-STATUS-')], [ sg.Text('DAC1'), sg.Slider(range=(0, 255), orientation='h', size=(34, 20), default_value=0, key='-DAC1-', enable_events=True) ], [ sg.Text('DAC2'),
'Pyplot Histogram': PyplotHistogram } sg.change_look_and_feel('LightGreen') figure_w, figure_h = 650, 650 # define the form layout listbox_values = list(fig_dict) col_listbox = [[ sg.Listbox(values=listbox_values, change_submits=True, size=(28, len(listbox_values)), key='-LISTBOX-') ], [sg.Text(' ' * 12), sg.Exit(size=(5, 2))]] col_multiline = sg.Col([[sg.MLine(size=(70, 35), key='-MULTILINE-')]]) col_canvas = sg.Col([[sg.Canvas(size=(figure_w, figure_h), key='-CANVAS-')]]) col_instructions = sg.Col([ [sg.Pane([col_canvas, col_multiline], size=(800, 600))], [ sg.Text( 'Grab square above and slide upwards to view source code for graph' ) ] ]) layout = [ [sg.Text('Matplotlib Plot Test', font=('ANY 18'))], [sg.Col(col_listbox), col_instructions], ] # create the form and show it without the plot
fig_agg_1 = fig_agg_2 = fig_agg_3 = None # 画像のヒストグラムを表示する用の変数 Image_height = 240 # 画面上に表示する画像の高さ Image_width = 320 # 画面上に表示する画像の幅 # ------------------------- # # デバイス(GPU)側メモリの確保 # ------------------------- # img_gpu_src = cv2.cuda.GpuMat() img_gpu_dst_1 = cv2.cuda.GpuMat() img_gpu_dst_2 = cv2.cuda.GpuMat() img_gpu_dst_3 = cv2.cuda.GpuMat() window = sg.Window('Demo Application - OpenCV Integration', [ [ sg.Image(filename='', key='image'), sg.Canvas(size=(Image_width, Image_height), key='-CANVAS_1-') ], [ sg.Image(filename='', key='image_2'), sg.Canvas(size=(Image_width, Image_height), key='-CANVAS_2-') ], [ sg.Image(filename='', key='image_3'), sg.Canvas(size=(Image_width, Image_height), key='-CANVAS_3-') ], ], location=(800, 400)) cap = cv2.VideoCapture(0) # Setup the camera as a capture device cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) while True: # The PSG "Event Loop"
def main(): ###### GUI LOGIC ###### iterations=100 #needed to init progress bar #define window layout sg.LOOK_AND_FEEL_TABLE['Reddit']['BORDER'] = 0 sg.change_look_and_feel('Reddit') btn_layout = [ [sg.Button('Run'),sg.Button('Preview Sofa', key='preview'), \ sg.Button('Stop')], ] col = [ [sg.Text('Please enter the following values',size=(30,3), \ font=('Helvetica',12), justification='center')], [sg.Text('Number of Anchor Points', size=(30,2)), \ sg.InputCombo(values=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \ 17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35, \ 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55, \ 56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75, \ 76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96, \ 97,98,99,100,128,256,512,\ 1024), key='N', size=(8,10),tooltip='whole number input')], [sg.Text('Number of Iterations', size=(30,2)), sg.InputText( \ key='iterations',size=(10,2),tooltip='whole number input')], [sg.Text('Show Hallway Outlines', size=(30,2)), sg.OptionMenu( \ values = ('True', 'False'), key='outline',size=(10,2))], [sg.Text('Smooth Sofa Object', size=(30,2)), sg.OptionMenu( \ values=('True','False'),key='smooth',default_value='False', \ size=(10,2))], [sg.Text('Hallway placement (height)', size=(30,1)), sg.Slider( \ range=(0,5), orientation='h', size=(10,10), default_value=5,\ key='b-param')], [sg.Text('Hallway placement (width)', size=(30,1)), sg.Slider( \ range=(0,2), orientation='h', size=(10,10), default_value=2,\ key='a-param')], [sg.Frame('',btn_layout,border_width=0,pad=((50,0),(50,0)))], [sg.ProgressBar(iterations,orientation='h',pad=((65,0),(10,0)), \ size=(20,20),key='progressbar')] ] layout = [ [sg.Canvas(key='-CANVAS-'),sg.VerticalSeparator( \ pad=((0,30),(43,43))),sg.Column(col),] ] #plotting logic so initial grid displays plt.style.use('ggplot') fig = Figure() ax=fig.add_subplot(111) #define window layout window = sg.Window('Moving Sofa Balancer',layout,finalize=True) # window canvas_elem = window.FindElement('-CANVAS-') #identify canvas elem canvas = canvas_elem.TKCanvas #place in TK fig_agg = draw_figure(canvas,fig) progress_bar = window['progressbar'] while True: #lets user preview sofas until run is pressed while True: ax.cla() events, values = window.read() #read arg vals into vars #----read arguments # Provide a way out when user closes program if events in ('Exit', None): window.close() exit(-1) try: test_var1 = int(values['N']) test_var2 = int(values['iterations']) except: sg.Popup('One or more inputs of incorrect type.', title='Type Err', line_width=30) continue N = int(values['N']) + 1 if N <= 8: tol = 1/50 if 18 > N > 8: tol = 1/150 if 30 > N > 18: tol = 1/500 if 60 > N > 30: tol= 1/1000 if N > 60: tol = 1/5000 if N > 120: tol = 1/50000 iterations = int(values['iterations']) wireframe = bool(values['outline'] == 'True') smooth = bool(values['smooth'] == 'True') a_param = int(values['a-param'])/10 b_param = int(values['b-param'])/10 #----make hallway objs based on args hallway_set = hallway_list(N,a_param,b_param) hallway = set_to_poly(hallway_set) #init vars and plotting logic minx,miny,maxx,maxy = hallway.bounds ax.set_xlim([-2.75,1.5]) ax.set_ylim([-1,2]) ax.set_aspect(1) if smooth: carver = get_carver(hallway_set) hallway_smth = hallway.difference(carver) ax.add_patch(PolygonPatch(hallway_smth,fc='#0087C9',ec='grey')) smth_area = hallway_smth.area init_area = smth_area ax.set_title('Area Change = %.16f, Area = %.16f' %( \ smth_area-init_area, smth_area),fontsize=10) if not smooth: ax.add_patch(PolygonPatch(hallway,fc='#0087C9',ec='grey')) new_area = hallway.area init_area = hallway.area ax.set_title('Area Change = %.16f, Area = %.16f' %( \ new_area-init_area, new_area),fontsize=10) if wireframe: for i in range(1,len(hallway_set)): x,y = hallway_set[i].exterior.xy ax.plot(x,y,linewidth=0.2) fig_agg.draw() if events in ('Run', None): break if events in ('Exit', None): exit(-1) #loop and push for i in range(iterations): event, values = window.Read(timeout=0.01) if event in ('Exit', None): window.close() exit(-1) if event in ('Stop', None): break progress_bar.UpdateBar(i+1,iterations) hallway,hallway_set = try_push(hallway,hallway_set,N,tol,0) #if recursion depth is met we terminate if type(hallway) is str: #str is sign of recursion depth reached exit(1) return 1 #reset canvas to redraw on ax.cla() plt.cla() ax.set_xlim([-2.75,1.5]) ax.set_ylim([-1,2]) ax.set_aspect(1) x,y = hallway_set[0].exterior.xy ax.plot(x,y,color='grey',linewidth=0.5) if wireframe: for i in range(1,len(hallway_set)): x,y = hallway_set[i].exterior.xy ax.plot(x,y,linewidth=0.2) if smooth: carver = get_carver(hallway_set) hallway_smth = hallway.difference(carver) ax.add_patch(PolygonPatch(hallway_smth,fc='#0087C9',ec='grey')) smth_area = hallway_smth.area ax.set_title('Area Change = %.16f, Area = %.16f' %( \ smth_area-init_area, smth_area),fontsize=10) if not smooth: ax.add_patch(PolygonPatch(hallway,fc='#0087C9',ec='grey')) new_area = hallway.area ax.set_title('Area Change = %.16f, Area = %.16f' %( \ new_area-init_area, new_area),fontsize=10) fig_agg.draw() #keeps figure open after completion plt.cla() ax.set_xlim([minx-.5,maxx+.5]) ax.set_ylim([miny-.25,maxy+.5]) ax.set_aspect(1) #ax.add_patch(PolygonPatch(hallway,fc='#FF5733')) if smooth: carver = get_carver(hallway_set) hallway = hallway.difference(carver) if wireframe: for i in range(1,len(hallway_set)): x,y = hallway_set[i].exterior.xy ax.plot(x,y,linewidth=0.2) ax.add_patch(PolygonPatch(hallway,fc='#0087C9',ec='grey')) ax.set_title('N=%d, Area = %.16f' %(N, hallway.area),fontsize=10)
def delete_figure_agg(figure_agg): figure_agg.get_tk_widget().forget() plt.close('all') layout = [ [ sg.Input(size=(30, 1)), sg.FileBrowse(key='-Image_path-'), sg.Radio('カメラ', 'picture', size=(10, 1), key='-WebCam-'), sg.Radio('画像', 'picture', default=True, size=(10, 1), key='-Image-'), ], [ sg.Image(filename='', size=(Image_width, Image_height), key='rgb'), sg.Canvas(size=(Image_width, Image_height), key='rgb_CANV'), sg.Image(filename='', size=(Image_width, Image_height), key='glay'), sg.Canvas(size=(Image_width, Image_height), key='glay_CANV'), sg.Image(filename='', size=(Image_width, Image_height), key='xyz'), sg.Canvas(size=(Image_width, Image_height), key='xyz_CANV'), ], [ sg.Image(filename='', size=(Image_width, Image_height), key='hsv'), sg.Canvas(size=(Image_width, Image_height), key='hsv_CANV'), sg.Image(filename='', size=(Image_width, Image_height), key='hls'), sg.Canvas(size=(Image_width, Image_height), key='hls_CANV'), sg.Image(filename='', size=(Image_width, Image_height), key='YCrCb'), sg.Canvas(size=(Image_width, Image_height), key='YCrCb_CANV'), ], [ sg.Image(filename='', size=(Image_width, Image_height), key='luv'),
'Axes Grid': AxesGrid, 'Exploring Normalizations': ExploringNormalizations, 'Different Scales': DifferentScales, 'Pyplot Box Plot': PyplotBoxPlot, 'Pyplot ggplot Style Sheet': PyplotGGPlotSytleSheet, 'Pyplot Line Poly Collection': PyplotLinePolyCollection, 'Pyplot Line Styles': PyplotLineStyles, 'Pyplot Scatter With Legend': PyplotScatterWithLegend, 'Artist Customized Box Plots': PyplotArtistBoxPlots, 'Artist Customized Box Plots 2': ArtistBoxplot2, 'Pyplot Histogram': PyplotHistogram } g.ChangeLookAndFeel('LightGreen') figure_w, figure_h = 650, 650 canvas_elem = g.Canvas(size=(figure_w, figure_h)) # get the canvas we'll be drawing on multiline_elem = g.Multiline(size=(70, 35), pad=(5, (3, 90))) # define the form layout listbox_values = [key for key in fig_dict.keys()] col_listbox = [[ g.Listbox(values=listbox_values, change_submits=True, size=(28, len(listbox_values)), key='func') ], [g.T(' ' * 12), g.Exit(size=(5, 2))]] layout = [ [g.Text('Matplotlib Plot Test', font=('current 18'))], [g.Column(col_listbox, pad=(5, (3, 330))), canvas_elem, multiline_elem], ]
def analyze_country(self, window, country): """ Creates chosen country spread graph layout and window :param window: :param country: :return: """ sg.ChangeLookAndFeel(self.gui_theme) sg.SetOptions(margins=(0, 3), border_width=1) loc = window.CurrentLocation() menu_elem = sg.Menu(menu, tearoff=False) plt.close() m = 0 r = requests.get(COUNTRY + country + '/status/confirmed') country_data = r.json() for i in range(len(country_data)): self.cases.append( [country_data[i]['Cases'], country_data[i]['Date']]) for i in range(len(self.cases)): element = self.cases[i] self.number.append(element[0]) plt.plot(self.number, label=country) m = max([m, max(self.number)]) plt.title(f'{country} spread') plt.ylabel('Cases') plt.xlabel('Days') plt.ylim([0, 1.1 * m]) plt.legend(loc='lower right', fontsize=8) plt.grid() fig = plt.gcf() figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds graph_layout = [[menu_elem], [sg.Canvas(size=(figure_w, figure_h), key='-CANVAS-')], [sg.Button('Back')]] w = sg.Window('{}'.format(APP_NAME), graph_layout, default_button_element_size=(12, 1), auto_size_buttons=False, location=(loc[0], loc[1]), force_toplevel=True, finalize=True) self.draw_figure(w['-CANVAS-'].TKCanvas, fig) window.Close() self.cases.clear() self.number.clear() return w
def main(): NUM_DATAPOINTS = 10000 # define the form layout layout = [[ sg.Text('Animated Matplotlib', size=(40, 1), justification='center', font='Helvetica 20') ], [sg.Canvas(size=(640, 480), key='-CANVAS-')], [sg.Text('Progress through the data')], [ sg.Slider(range=(0, NUM_DATAPOINTS), size=(60, 10), orientation='h', key='-SLIDER-') ], [sg.Text('Number of data points to display on screen')], [ sg.Slider(range=(10, 500), default_value=40, size=(40, 10), orientation='h', key='-SLIDER-DATAPOINTS-') ], [ sg.Button('Exit', size=(10, 1), pad=((280, 0), 3), font='Helvetica 14') ]] # create the form and show it without the plot window = sg.Window( 'Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True) canvas_elem = window['-CANVAS-'] slider_elem = window['-SLIDER-'] canvas = canvas_elem.TKCanvas # draw the initial plot in the window fig = Figure() ax = fig.add_subplot(111) ax.set_xlabel("X axis") ax.set_ylabel("Y axis") ax.grid() fig_agg = draw_figure(canvas, fig) # make a bunch of random data points dpts = [randint(0, 10) for x in range(NUM_DATAPOINTS)] for i in range(len(dpts)): event, values = window.read(timeout=10) if event in ('Exit', None): exit(69) slider_elem.update( i) # slider shows "progress" through the data points ax.cla() # clear the subplot ax.grid() # draw the grid data_points = int(values['-SLIDER-DATAPOINTS-'] ) # draw this many data points (on next line) ax.plot(range(data_points), dpts[i:i + data_points], color='purple') fig_agg.draw() window.close()
def make_window(theme=None): NAME_SIZE = 23 def name(name): dots = NAME_SIZE - len(name) - 2 return sg.Text(name + ' ' + '•' * dots, size=(NAME_SIZE, 1), justification='r', pad=(0, 0), font='Courier 10') sg.theme(theme) # NOTE that we're using our own LOCAL Menu element if use_custom_titlebar: Menu = sg.MenubarCustom else: Menu = sg.Menu treedata = sg.TreeData() treedata.Insert( "", '_A_', 'Tree Item 1', [1234], ) treedata.Insert("", '_B_', 'B', []) treedata.Insert( "_A_", '_A1_', 'Sub Item 1', ['can', 'be', 'anything'], ) layout_l = [ [name('Text'), sg.Text('Text')], [name('Input'), sg.Input(s=15)], [name('Multiline'), sg.Multiline(s=(15, 2))], [name('Output'), sg.Output(s=(15, 2))], [ name('Combo'), sg.Combo(sg.theme_list(), default_value=sg.theme(), s=(15, 22), enable_events=True, readonly=True, k='-COMBO-') ], [name('OptionMenu'), sg.OptionMenu([ 'OptionMenu', ], s=(15, 2))], [name('Checkbox'), sg.Checkbox('Checkbox')], [name('Radio'), sg.Radio('Radio', 1)], [name('Spin'), sg.Spin([ 'Spin', ], s=(15, 2))], [name('Button'), sg.Button('Button')], [ name('ButtonMenu'), sg.ButtonMenu('ButtonMenu', sg.MENU_RIGHT_CLICK_EDITME_EXIT) ], [name('Slider'), sg.Slider((0, 10), orientation='h', s=(10, 15))], [ name('Listbox'), sg.Listbox(['Listbox', 'Listbox 2'], no_scrollbar=True, s=(15, 2)) ], [name('Image'), sg.Image(sg.EMOJI_BASE64_HAPPY_THUMBS_UP)], [name('Graph'), sg.Graph((125, 50), (0, 0), (125, 50), k='-GRAPH-')] ] layout_r = [ [ name('Canvas'), sg.Canvas(background_color=sg.theme_button_color()[1], size=(125, 40)) ], [ name('ProgressBar'), sg.ProgressBar(100, orientation='h', s=(10, 20), k='-PBAR-') ], [ name('Table'), sg.Table([[1, 2, 3], [4, 5, 6]], ['Col 1', 'Col 2', 'Col 3'], num_rows=2) ], [name('Tree'), sg.Tree(treedata, [ 'Heading', ], num_rows=3)], [name('Horizontal Separator'), sg.HSep()], [name('Vertical Separator'), sg.VSep()], [name('Frame'), sg.Frame('Frame', [[sg.T(s=15)]])], [name('Column'), sg.Column([[sg.T(s=15)]])], [ name('Tab, TabGroup'), sg.TabGroup( [[sg.Tab('Tab1', [[sg.T(s=(15, 2))]]), sg.Tab('Tab2', [[]])]]) ], [ name('Pane'), sg.Pane([sg.Col([[sg.T('Pane 1')]]), sg.Col([[sg.T('Pane 2')]])]) ], [name('Push'), sg.Push(), sg.T('Pushed over')], [name('VPush'), sg.VPush()], [name('Sizer'), sg.Sizer(1, 1)], [name('StatusBar'), sg.StatusBar('StatusBar')], [name('Sizegrip'), sg.Sizegrip()] ] # Note - LOCAL Menu element is used (see about for how that's defined) layout = [[ Menu([['File', ['Exit']], ['Edit', [ 'Edit Me', ]]], k='-CUST MENUBAR-', p=0) ], [ sg.T('PySimpleGUI Elements - Use Combo to Change Themes', font='_ 14', justification='c', expand_x=True) ], [ sg.Checkbox('Use Custom Titlebar & Menubar', use_custom_titlebar, enable_events=True, k='-USE CUSTOM TITLEBAR-', p=0) ], [sg.Col(layout_l, p=0), sg.Col(layout_r, p=0)]] window = sg.Window('The PySimpleGUI Element List', layout, finalize=True, right_click_menu=sg.MENU_RIGHT_CLICK_EDITME_VER_EXIT, keep_on_top=True, use_custom_titlebar=use_custom_titlebar) window['-PBAR-'].update(30) # Show 30% complete on ProgressBar window['-GRAPH-'].draw_image( data=sg.EMOJI_BASE64_HAPPY_JOY, location=(0, 50)) # Draw something in the Graph Element return window
# ------------------------------- END OF YOUR MATPLOTLIB CODE ------------------------------- # ------------------------------- Beginning of Matplotlib helper code ----------------------- def draw_figure(canvas, figure): figure_canvas_agg = FigureCanvasTkAgg(figure, canvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1) return figure_canvas_agg # ------------------------------- Beginning of GUI CODE ------------------------------- # define the window layout layout = [[sg.Text('Plot test')], [sg.Canvas(key='-CANVAS-')], [sg.Button('Ok')]] # create the form and show it without the plot window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True, element_justification='center', font='Helvetica 18') # add the plot to the window fig_canvas_agg = draw_figure(window['-CANVAS-'].TKCanvas, fig1) event, values = window.read() window.close()
def main(): canvas_elem = sg.Canvas(size=(640, 480)) # get the canvas we'll be drawing on # define the form layout layout = [[ sg.Text('Animated Matplotlib', size=(40, 1), justification='center', font='Helvetica 20') ], [canvas_elem], [ sg.ReadFormButton('Exit', size=(10, 2), pad=((280, 0), 3), font='Helvetica 14') ]] # create the form and show it without the plot form = sg.FlexForm( 'Demo Application - Embedding Matplotlib In PySimpleGUI') form.Layout(layout) form.Finalize() canvas = canvas_elem.TKCanvas while True: button, values = form.ReadNonBlocking() if button is 'Exit' or values is None: exit(69) def PyplotScatterWithLegend(): import matplotlib.pyplot as plt from numpy.random import rand fig, ax = plt.subplots() for color in ['red', 'green', 'blue']: n = 750 x, y = rand(2, n) scale = 200.0 * rand(n) ax.scatter(x, y, c=color, s=scale, label=color, alpha=0.3, edgecolors='none') ax.legend() ax.grid(True) return fig fig = PyplotScatterWithLegend() figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds figure_w, figure_h = int(figure_w), int(figure_h) photo = tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) canvas.create_image(640 / 2, 480 / 2, image=photo) figure_canvas_agg = FigureCanvasAgg(fig) figure_canvas_agg.draw() # Unfortunately, there's no accessor for the pointer to the native renderer tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2)
"DURATION (s)": 90, "MAX POWER": None, "TAR 1 TSET": 23.5, "TAR 2 TSET": None, "CAL STD LEN": 5, "AMB TSET": None, } settingsDisplay = [[ sg.Column([[sg.Text(setting, justification='right')] for setting in profileSettings.keys()]), sg.Column([[sg.Text(str(profileSettings[setting]), justification='left')] for setting in profileSettings.keys()]) ]] makeIndicator = lambda key, color=None: sg.Canvas( size=(10, 10), background_color=color, key=key) hwStatusIndicators = [ makeIndicator('armIndicator', 'red'), sg.Text('ARM '), makeIndicator('enremIndicator', 'blue'), sg.Text('ENREM '), makeIndicator('flirIndicator', 'yellow'), sg.Text('FLIR '), ] settingsDisplayColumn = [[ sg.Column(settingsDisplay), sg.Column(mainButtons, key='buttonShelf'), ], hwStatusIndicators]
import PySimpleGUI as sg #This function returns the RGB parameters of sliders to Hex def rgb_hex(rgb): return "%02x%02x%02x" % rgb sg.theme("Topanga") layout = [[ sg.Text(text="HEX: ", font=("Rockwell", 17)), sg.Text(text='#000000', key="codeHEX", font=("Rockwell", 17)) ], [sg.Canvas(size=(350, 250), key="Canvas", background_color="#000000")], [sg.Text("Red", font=("Rockwell", 15))], [ sg.Slider((0, 255), font=("Rockwell", 17), key="sliderRED", orientation="horizontal", enable_events=True, disable_number_display=False) ], [sg.Text("Green", font=("Rockwell", 15))], [ sg.Slider((0, 255), font=("Rockwell", 17), key="sliderGREEN", orientation="horizontal", enable_events=True, disable_number_display=False) ], [sg.Text("Blue", font=("Rockwell", 15))],
def main(): ###### Gather default data ####### tether = False astpriority = False dncpart = False settings = build.settings() openers = settings[0] fights = settings[2] openlist = settings[1] fightlist = settings[3] jobs = build.genjobs() party = build.genparty(jobs) pbuffs = build.genpbuffs(party, tether, dncpart) buffs = build.genbuffs() dots = build.gendots() dex = 3662 WD = 114 det = 1462 ss = 1283 crit = 1967 + 1360 dh = 1806 + 560 wepdelay = 3.04 gcd = stats.determinegcd(ss) abilities = build.genabil(wepdelay, gcd) layout = [ [sg.Text("BRD Simulator"), sg.Text('', size=(20, 1))], [ sg.Text("Sim One Stats"), sg.Text(''), sg.Text('', size=(22, 1)), sg.Text('Sim Two Stats') ], [ sg.Text("Weapon Damage", size=(14, 1)), sg.Input(default_text=WD, size=(8, 1), key='wd1', do_not_clear=True), sg.Text('', size=(12, 1)), sg.Text("Weapon Damage", size=(14, 1)), sg.Input(default_text='', size=(8, 1), key='wd2', do_not_clear=True) ], [ sg.Text("Weapon Delay", size=(14, 1)), sg.Input(default_text=wepdelay, size=(8, 1), key='del1', do_not_clear=True), sg.Text('', size=(12, 1)), sg.Text("Weapon Delay", size=(14, 1)), sg.Input(default_text=wepdelay, size=(8, 1), key='del2', do_not_clear=True) ], [ sg.Text("Dexterity", size=(14, 1)), sg.Input(default_text=dex, size=(8, 1), key='dex1', do_not_clear=True), sg.Text('', size=(12, 1)), sg.Text("Dexterity", size=(14, 1)), sg.Input(size=(8, 1), key='dex2', do_not_clear=True) ], [ sg.Text("Critical Hit Rate", size=(14, 1)), sg.Input(default_text=crit, size=(8, 1), key='crit1', do_not_clear=True), sg.Text('', size=(12, 1), key='crate1'), sg.Text("Critical Hit Rate", size=(14, 1)), sg.Input(default_text='3347', size=(8, 1), key='crit2', do_not_clear=True), sg.Text('', key='crate2', size=(12, 1)) ], [ sg.Text("Direct Hit", size=(14, 1)), sg.Input(default_text=dh, size=(8, 1), key='dh1', do_not_clear=True), sg.Text('', size=(12, 1), key='direct1'), sg.Text("Direct Hit", size=(14, 1)), sg.Input(default_text='2046', size=(8, 1), key='dh2', do_not_clear=True), sg.Text('', key='direct2', size=(10, 1)) ], [ sg.Text("Determination", size=(14, 1)), sg.Input(default_text=det, size=(8, 1), key='det1', do_not_clear=True), sg.Text('', size=(12, 1), key='deter1'), sg.Text("Determination", size=(14, 1)), sg.Input(default_text='1462', size=(8, 1), key='det2', do_not_clear=True), sg.Text('', key='deter2', size=(10, 1)) ], [ sg.Text("Skill Speed", size=(14, 1)), sg.Input(default_text=ss, size=(8, 1), key='sks1', do_not_clear=True), sg.Text('', size=(12, 1), key='skill1'), sg.Text("Skill Speed", size=(14, 1)), sg.Input(default_text='1283', size=(8, 1), key='sks2', do_not_clear=True), sg.Text('', key='skill2', size=(10, 1)) ], [ sg.Text("Opener", size=(14, 1)), sg.InputCombo(openlist, key='open1'), sg.Text('', size=(7, 1)), sg.Text("Opener", size=(14, 1)), sg.InputCombo(openlist, key='open2') ], [ sg.Text("Fight", size=(14, 1), tooltip='Determine fight breaks, if any'), sg.InputCombo(fightlist, key='fights'), sg.Text('', size=(10, 1)), sg.Checkbox('Create Logs', size=(10, 1), key='logs') ], [ sg.Text("Length of Fight", tooltip='How long is the fight', size=(16, 1)), sg.Input(default_text='300', size=(8, 1), key='length'), sg.Text('', size=(9, 1)), sg.Checkbox('Party Modifier', size=(10, 1), key='partymod') ], [ sg.Text( "Run How many Times", tooltip= 'The Higher number, the longer and more accurate the sim is', size=(16, 1)), sg.Input(default_text='200', size=(7, 1), key='runtime'), sg.Text('', size=(10, 1)), sg.Checkbox('Use Potion', tooltip='Will Still use if specified in opener', size=(8, 1), key='potion') ], [ sg.Button('Run Sim', key='sim'), sg.Text('', size=(20, 1)), sg.Button('Set Party', key='party'), sg.Button('Set Buff Times', key='buffs') ] ] sim1 = ['wd1', 'del1', 'dex1', 'crit1', 'dh1', 'det1', 'sks1'] sim2 = ['wd2', 'del2', 'dex2', 'crit2', 'dh2', 'det2', 'sks2'] window = sg.Window("BRD Simulator", icon='graphics\\BRD.png').Layout(layout) win2_active = False win3_active = False win4_active = False while True: button, values = window.Read(timeout=100) if button is None: break #Update window elements try: string = str(stats.determinecrit(int( values['crit1']))[0]) + '% ' + str( stats.determinecrit(int(values['crit1']))[1]) + '% ' window.FindElement('crate1').Update(string) except: window.FindElement('crate1').Update('') try: window.FindElement('direct1').Update( str(stats.determinedh(int(values['dh1']))) + '%') except: window.FindElement('direct1').Update('') try: window.FindElement('deter1').Update( str(stats.determinedet(int(values['det1']))) + '%') except: window.FindElement('deter1').Update('') try: window.FindElement('skill1').Update( stats.determinegcd(int(values['sks1']))) except: window.FindElement('skill1').Update('') try: string2 = str(stats.determinecrit(int( values['crit2']))[0]) + '% ' + str( stats.determinecrit(int(values['crit2']))[1]) + '% ' window.FindElement('crate2').Update(string2) except: window.FindElement('crate2').Update('') try: window.FindElement('direct2').Update( str(stats.determinedh(int(values['dh2']))) + '%') except: window.FindElement('direct2').Update('') try: window.FindElement('deter2').Update( str(stats.determinedet(int(values['det2']))) + '%') except: window.FindElement('deter2').Update('') try: window.FindElement('skill2').Update( stats.determinegcd(int(values['sks2']))) except: window.FindElement('skill2').Update('') #Process window generation when we want to change party UI if not win2_active and button == 'party': window.Hide() win2_active = True layout2 = [ [ sg.Text('Job', size=(8, 1)), sg.Text('Member', size=(8, 1)), sg.Text('Buff Priority', size=(8, 1)) ], ] for i in jobs.values(): row = [] row.append(sg.Text(i.name, size=(8, 1))) row.append( sg.Checkbox('', size=(8, 1), default=i.active, key=i.name)) if i.name == 'AST': row.append( sg.Checkbox('AST Priority', size=(8, 1), default=astpriority, key='astprio')) elif i.name == 'DRG': row.append( sg.Checkbox('DRG Tether', size=(8, 1), default=tether, key='tether')) elif i.name == 'DNC': row.append( sg.Checkbox('Partner', size=(8, 1), default=tether, key='partner')) layout2.append(row) layout2.append([sg.Button('Done')]) win2 = sg.Window('Party Screen').Layout(layout2) #Process information when Sim its clicked if not win3_active and button == 'sim': simoneaction = True simtwoaction = True simonetable = [] simtwotable = [] fight = fights[values['fights']] logging = values['logs'] build.setpmod(abilities, values['partymod']) potion = values['potion'] for i in sim1: if values[i] == '': simoneaction = False elif i == 'crit1': rate, dam = stats.determinecrit(int(values[i])) simonetable.append(rate) simonetable.append(dam) elif i == 'dh1': simonetable.append(stats.determinedh(int(values[i]))) elif i == 'sks1': simonetable.append(int(values[i])) simonetable.append(stats.determinegcd(int(values[i]))) else: simonetable.append(float(values[i])) if not simoneaction: sg.PopupOK('Please enter in Values for Sim One') else: for i in sim2: if values[i] == '': simtwoaction = False elif i == 'crit2': rate, dam = stats.determinecrit(int(values[i])) simtwotable.append(rate) simtwotable.append(dam) elif i == 'dh2': simtwotable.append(stats.determinedh(int(values[i]))) elif i == 'sks2': simtwotable.append(int(values[i])) simtwotable.append(stats.determinegcd(int(values[i]))) else: simtwotable.append(float(values[i])) if simtwoaction: runtimes = int(values['runtime']) runlength = int(values['length']) opener1 = openers[values['open1']] opener2 = openers[values['open2']] potency1 = [] potency2 = [] layoutprog = [[sg.Text('Running Sim', key='progtext')], [ sg.ProgressBar(runtimes, orientation='h', size=(20, 20), key='progbar') ], [sg.Button('Cancel')]] progwin = sg.Window('Running Sim One', layoutprog) bar = progwin.FindElement('progbar') i = runtimes while i > 0: progevent, progvals = progwin.Read(timeout=100) if progevent == 'Cancel' or progevent is None: break jobruns = 0 if i > 5: jobruns = 6 else: jobruns = i results = asyncio.run( runsim(jobruns, runlength, i, opener1, fight, simonetable, abilities, party, pbuffs, buffs, dots, potion, astpriority, dncpart, logging)) potency1 = potency1 + results i = i - jobruns bar.UpdateBar(runtimes - i) progwin.TKroot.title('Running Sim Two') i = runtimes while i > 0: progevent, progvals = progwin.Read(timeout=100) if progevent == 'Cancel' or progevent is None: break jobruns = 0 if i > 5: jobruns = 6 else: jobruns = i results = asyncio.run( runsim(jobruns, runlength, i, opener2, fight, simtwotable, abilities, party, pbuffs, buffs, dots, potion, astpriority, dncpart, logging)) potency2 = potency2 + results i = i - jobruns bar.UpdateBar(runtimes - i) progwin.Close() sg.PopupAnimated('graphics/loading.gif', 'Finalizing your results', time_between_frames=1) maxval = max(potency1) minval = min(potency1) if runtimes > 1: aveval = statistics.mean(potency1) deviation = round(statistics.stdev(potency1), 3) else: aveval = potency1[0] deviation = potency1[0] maxval2 = max(potency2) minval2 = min(potency2) if runtimes > 1: aveval2 = statistics.mean(potency2) deviation2 = round(statistics.stdev(potency2), 3) else: aveval2 = potency2[0] deviation = potency2[0] if aveval > aveval2: color1 = '#3CB371' color2 = '#B22222' else: color2 = '#3CB371' color1 = '#B22222' results_layout = [ [ sg.Text('Sim One'), sg.Text('', size=(16, 1)), sg.Text(str(round(aveval, 3)), size=(8, 1), font=('Helvetica', 20), text_color=color1), sg.Text('', size=(2, 1)), sg.Text('Sim Two', size=(22, 1)), sg.Text(str(round(aveval2, 3)), size=(8, 1), font=('Helvetica', 20), text_color=color2) ], [ sg.Text('Weapon Damage: ', size=(14, 1)), sg.Text(str(int(simonetable[0])), size=(8, 1)), sg.Text('Max', size=(8, 1)), sg.Text(maxval, size=(10, 1)), sg.Text('Weapon Damage: ', size=(14, 1)), sg.Text(str(int(simtwotable[0])), size=(8, 1)), sg.Text('Max', size=(8, 1)), sg.Text(maxval2) ], [ sg.Text('Weapon Delay: ', size=(14, 1)), sg.Text(str(simonetable[1]), size=(8, 1)), sg.Text('Min', size=(8, 1)), sg.Text(minval, size=(10, 1)), sg.Text('Weapon Delay: ', size=(14, 1)), sg.Text(str(simtwotable[1]), size=(8, 1)), sg.Text('Min', size=(8, 1)), sg.Text(minval2) ], [ sg.Text('Dexterity: ', size=(14, 1)), sg.Text(str(int(simonetable[2])), size=(8, 1)), sg.Text('Deviation', size=(8, 1)), sg.Text(deviation, size=(10, 1)), sg.Text('Dexterity: ', size=(14, 1)), sg.Text(str(int(simtwotable[2])), size=(8, 1)), sg.Text('Deviation', size=(8, 1)), sg.Text(deviation2) ], [ sg.Text('Critical Hit Rate: ', size=(14, 1)), sg.Text(str(int(values['crit1'])), size=(8, 1)), sg.Text('', size=(20, 1)), sg.Text('Critical Hit Rate: ', size=(14, 1)), sg.Text(str(int(values['crit2']))) ], [ sg.Text('Direct Hit: ', size=(14, 1)), sg.Text(str(int(values["dh1"])), size=(8, 1)), sg.Text('', size=(20, 1)), sg.Text('Direct Hit: ', size=(14, 1)), sg.Text(str(int(values['dh2']))) ], [ sg.Text('Determination: ', size=(14, 1)), sg.Text(str(int(simonetable[6])), size=(8, 1)), sg.Text('', size=(20, 1)), sg.Text('Determination: ', size=(14, 1)), sg.Text(str(int(simtwotable[6]))) ], [ sg.Text('Skillspeed: ', size=(14, 1)), sg.Text(str(int(simonetable[7])), size=(8, 1)), sg.Text('', size=(20, 1)), sg.Text('Skillspeed: ', size=(14, 1)), sg.Text(str(int(simtwotable[7]))) ], [ sg.Text('Opener: ', size=(14, 1)), sg.Text(values["open1"], size=(30, 1)), sg.Text('Opener: ', size=(14, 1)), sg.Text(values["open2"]) ], #[sg.Canvas(size=(figure_w, figure_h), key='canvas'),sg.Canvas(size=(figure_w, figure_h), key='canvas2')], #[sg.Text(sim.returnpartystring())], [sg.Button('Close')] ] if logging: results_layout[9].append( sg.Button('View Logs', key='logview')) resultwindow = sg.Window( "Sim Results", force_toplevel=True).Layout(results_layout).Finalize() window.Hide() sg.PopupAnimated(image_source=None) win3_active = True else: runtimes = int(values['runtime']) runlength = int(values['length']) opener1 = openers[values['open1']] fight = fights[values['fights']] logging = values['logs'] build.setpmod(abilities, values['partymod']) potion = values['potion'] potency1 = [] viewtimes = [[]] abilitydict = {} firstime = False layoutprog = [[sg.Text('Running Sim', key='progtext')], [ sg.ProgressBar(runtimes, orientation='h', size=(20, 20), key='progbar') ], [sg.Button('Cancel')]] progwin = sg.Window('Running Sim', layoutprog) bar = progwin.FindElement('progbar') i = runtimes while i > 0: progevent, progvals = progwin.Read(timeout=100) if progevent == 'Cancel' or progevent is None: break jobruns = 0 if i > 5: jobruns = 6 else: jobruns = i results, times, ability = asyncio.run( run1sim(jobruns, runlength, (runtimes - i), opener1, fight, simonetable, abilities, party, pbuffs, buffs, dots, potion, astpriority, dncpart, logging)) potency1 = potency1 + results for u in times: viewtimes.append(u) for u in ability.keys(): if ability[u] > 0: if u in abilitydict.keys(): abilitydict[ u] = abilitydict[u] + ability[u] else: abilitydict[u] = ability[u] i = i - jobruns bar.UpdateBar(runtimes - i) progwin.Close() sg.PopupAnimated('graphics/loading.gif', 'Finalizing your results', time_between_frames=1) maxval = max(potency1) minval = min(potency1) viewtimes.remove([]) allpotency = 0 for i in abilitydict.keys(): allpotency = allpotency + abilitydict[i] for i in abilitydict.keys(): abilitydict[i] = round( (abilitydict[i] / allpotency) * 100, 2) sort = sorted(abilitydict, key=abilitydict.__getitem__, reverse=True) viewtable = numpy.mean(viewtimes, axis=0) if runtimes > 1: aveval = round(statistics.mean(potency1), 3) deviation = round(statistics.stdev(potency1), 3) else: aveval = round(potency1[0], 3) deviation = round(potency1[0], 3) if runtimes > 1: plt.plot(list(range(5, runlength)), viewtable) plt.xlabel('Time') plt.xlabel('DPS') #plt.hist(potency1, # color='blue', # edgecolor='black', # bins=int((maxval - minval)/(runtimes/(runtimes*.15)))) fig = plt.gcf() figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds else: figure_w = 8 figure_h = 1 results_layout = [[ sg.Text('Stats Used'), sg.Text('', size=(16, 1)), sg.Text(str(round(aveval, 3)), size=(8, 1), font=('Helvetica', 20)) ], [ sg.Text('Weapon Damage: ', size=(14, 1)), sg.Text(str(int(simonetable[0])), size=(8, 1)), sg.Text('Max', size=(8, 1)), sg.Text(maxval) ], [ sg.Text('Weapon Delay: ', size=(14, 1)), sg.Text(str(simonetable[1]), size=(8, 1)), sg.Text('Min', size=(8, 1)), sg.Text(minval) ], [ sg.Text('Dexterity: ', size=(14, 1)), sg.Text(str(int(simonetable[2])), size=(8, 1)), sg.Text('Deviation', size=(8, 1)), sg.Text(deviation) ], [ sg.Text('Critical Hit Rate: ', size=(14, 1)), sg.Text(str(int((values['crit1'])))) ], [ sg.Text('Direct Hit: ', size=(14, 1)), sg.Text(str(int(values['dh1']))) ], [ sg.Text('Determination: ', size=(14, 1)), sg.Text(str(int(simonetable[6]))) ], [ sg.Text('Skillspeed: ', size=(14, 1)), sg.Text(str(int(simonetable[7]))) ], [ sg.Text('Opener: ', size=(14, 1)), sg.Text(values["open1"], size=(30, 1)) ], [ sg.Canvas(size=(figure_w, figure_h), key='canvas') ]] row = [] x = 0 for i in sort: if x == 4: row.append( sg.Text(i + ' ' + str(abilitydict[i]) + '%', size=(18, 1))) results_layout.append(row) x = 0 elif x == 0: row = [ sg.Text(i + ' ' + str(abilitydict[i]) + '%', size=(18, 1)) ] x = x + 1 else: row.append( sg.Text(i + ' ' + str(abilitydict[i]) + '%', size=(18, 1))) x = x + 1 if x > 0: results_layout.append(row) finalrow = [sg.Button('Close')] if logging: finalrow.append(sg.Button('View Logs', key='logview')) results_layout.append(finalrow) resultwindow = sg.Window( "Sim Results", force_toplevel=True).Layout(results_layout).Finalize() window.Hide() if runtimes > 1: fig_photo = draw_figure( resultwindow.FindElement('canvas').TKCanvas, fig) sg.PopupAnimated(image_source=None) win3_active = True #except: # sg.PopupOK('Please Enter Valid Numbers') if not win4_active and button == 'buffs': bufflayout = [[sg.Text('Buff Start Times')]] for i in pbuffs.values(): if not (i.name == 'Not My Card' or i.name == 'Bole' or i.name == 'Balance' or i.name == 'Divination'): addtolayout = [] addtolayout.append(sg.Text(i.name, size=(12, 1))) addtolayout.append( sg.Input(default_text=i.starttime, key=i.name, size=(8, 1))) bufflayout.append(addtolayout) bufflayout.append([sg.Button('Done', key='donebuff')]) buffwindow = sg.Window('Set Buff Timers').Layout(bufflayout) window.Hide() win4_active = True if win2_active: button2, values2 = win2.Read(timeout=100) if button2 is None: win2_active = False win2.Close() window.UnHide() window.BringToFront() elif button2 is 'Done': partyset = [] membernumber = 0 for i in jobs.values(): i.active = values2[i.name] if values2[i.name]: membernumber = membernumber + 1 if membernumber > 7: sg.PopupOK('You have to many members') else: party = build.genparty(jobs) tether = values2['tether'] astpriority = values2['astprio'] dncpart = values2['partner'] pbuffs = build.genpbuffs(party, tether, dncpart) win2_active = False win2.Close() window.UnHide() window.BringToFront() if win3_active: resevents, resvalus = resultwindow.Read(timeout=100) if resevents is None or resevents == 'Close': win3_active = False resultwindow.Close() window.UnHide() window.BringToFront() elif resevents is 'logview': logfile = open('BRD_Sim_Log1', 'r') sg.PopupScrolled(logfile.read(), size=(80, None)) if win4_active: buffevents, buffvalues = buffwindow.Read() if buffevents is None: win4_active = False buffwindow.Close() window.UnHide() window.BringToFront() elif buffevents == 'donebuff': try: for i in pbuffs.values(): i.starttime = float(buffvalues[i.name]) i.default = float(buffvalues[i.name]) win4_active = False buffwindow.Close() window.UnHide() except: sg.PopupOK("Please enter valid times")
def gui(): sg.theme('LightGreen') figure_w = 650 figure_h = 650 # define the form layout layout = [[sg.Text('Demo - Pressure Response', justification='center', font='Helvetica 20')], [sg.Canvas(size=(figure_w, figure_h), key='-CANVAS_plot-'), sg.Canvas(size=(figure_w, figure_h), key='-CANVAS_image-') ,], # [sg.Text('Force value and coordinates:',size=(40, 1),font='Helvetica 20'), [sg.Text('Force value and coordinates:',font='Helvetica 20'), sg.Text( 'loading:',font='Helvetica 20', key='-OUTPUT-')], # [[sg.Button('Connect',size=(10, 2), pad=((280, 20), 3), font='Helvetica 14')], [sg.Button('Connect',size=(10, 2), font='Helvetica 14'), sg.Button('Exit', size=(10, 2), font='Helvetica 14')]] # create the form and show it without the plot window = sg.Window('Demo - Pressure Response', layout, resizable=True, finalize=True) image_elem = window['-CANVAS_image-'] canvas_plot_elem = window['-CANVAS_plot-'] canvas_plot = canvas_plot_elem.TKCanvas # draw the intitial scatter plot fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111, projection='3d') # fig, ax = plt.subplots(111, projection='3d') ax.grid(True) fig_agg = draw_figure(canvas_plot, fig) X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) count = 0 while True: event, values = window.read(timeout=10) if event in ('Exit', None): exit(69) if event in ('Connect', None): sg.popup_ok('Successful Connection') # Shows OK button window['-OUTPUT-'].update('null') ax.cla() ax.grid(True) R = np.sqrt(X ** 2 + Y ** 2) # Z = np.sin(R+Datamatrix) Z = np.sin(R+count) # surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, # linewidth=0, antialiased=False) ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1) ax.set_zlim3d(-1.01, 1.01) # ax.w_zaxis.set_major_locator(LinearLocator(10)) # ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) # fig.colorbar(surf, shrink=0.5, aspect=5) ## Show colorbar ax.legend() fig_agg.draw() count = count + 1 # show camera image # imgbytes = cv.imencode('.png', cv_image)[1].tobytes() # ditto # img = Image.fromarray(cv_image) # create PIL image from frame # bio = io.BytesIO() # a binary memory resident stream # img.save(bio, format= 'PNG') # save image as png to it # imgbytes = bio.getvalue() # this can be used by OpenCV hopefully # image_elem.update(data=imgbytes) window.close()
toolbar.update() figure_canvas_agg.get_tk_widget().pack(side='right', fill='both', expand=1) class Toolbar(NavigationToolbar2Tk): def __init__(self, *args, **kwargs): super(Toolbar, self).__init__(*args, **kwargs) # ------------------------------- PySimpleGUI CODE layout = [ [sg.T('Graph: y=sin(x)')], [sg.B('Plot'), sg.B('Exit')], [sg.T('Controls:')], [sg.Canvas(key='controls_cv')], [sg.T('Figure:')], [ sg.Column( layout=[[ sg.Canvas( key='fig_cv', # it's important that you set this size size=(400 * 2, 400)) ]], background_color='#DAE0E6', pad=(0, 0)) ], [sg.B('Alive?')] ]
]] reload_plot = [[ sg.FileBrowse('Browse', initial_folder='E:\Python_files\Scan_Data', key='-FPATH-', button_color=('white', 'grey'), size=(7, 2)), sg.Button('PLOT', button_color=('black', 'yellow'), size=(9, 2), disabled=False) ]] layout = [[ sg.Canvas(size=(250, 250), background_color='black', key='canvas'), sg.Frame('SCANNER', col_scan), sg.Frame('CONTROL', col_control, element_justification="center") ], [sg.Frame('RE-PLOT', reload_plot)], [ sg.Input('Please connect the device', key='-MSG-', justification='center') ]] window = sg.Window('3D SCAN', layout, return_keyboard_events=True) #Flag Variables FL_CON = False FL_SCAN = False FL_DONE = False
def run(self, action): if action is not "gui": self.perform_command_line(action) return sg.theme('DarkAmber') star_tab_layout = [[sg.T('Plotting expected star color\n')], [ sg.Text('Select star type:'), sg.Combo( available_templates, key='star_type', default_value=self.used_config['star_type']) ], [ sg.Text('Saturation:'), sg.Input(key='saturation', default_text='1.0', size=(10, )) ], [sg.Button('Check star color')]] emission_tab_layout = [[ sg.T('Plotting expected emission lines color\n') ], [sg.Text('Select emission lines:')], [ sg.Combo(available_emission_lines, key='emission_line_1', default_value='H alpha'), sg.Text('Strength: '), sg.Input(key='emission_line_1_strength', default_text='1.0', size=(10, )) ], [ sg.Combo(available_emission_lines, key='emission_line_2', default_value='OIII'), sg.Text('Strength: '), sg.Input(key='emission_line_2_strength', default_text='1.0', size=(10, )) ], [ sg.Combo(available_emission_lines, key='emission_line_3', default_value='SII'), sg.Text('Strength: '), sg.Input(key='emission_line_3_strength', default_text='1.0', size=(10, )) ], [sg.Button('Check lines combined color')]] layout = [[ sg.Text('Select camera:'), sg.Combo(available_cameras, key='camera', default_value=self.used_config['camera']), ], [ sg.Text('Select master filter (for all channels):'), sg.Combo(available_filters, key='filter_L', default_value=self.used_config['filter_L']), ], [ sg.Text('Select filter for R channel:'), sg.Combo(available_filters, key='filter_R', default_value=self.used_config['filter_R']), sg.Text('Multiplier:'), sg.Input(key='red_x', default_text='1.0', size=(10, )), ], [ sg.Text('Select filter for G channel:'), sg.Combo(available_filters, key='filter_G', default_value=self.used_config['filter_G']), sg.Text('Multiplier:'), sg.Input(key='green_x', default_text='1.0', size=(10, )), ], [ sg.Text('Select filter for B channel:'), sg.Combo(available_filters, key='filter_B', default_value=self.used_config['filter_B']), sg.Text('Multiplier:'), sg.Input(key='blue_x', default_text='1.0', size=(10, )), ], [ sg.TabGroup([[ sg.Tab('Stars', star_tab_layout), sg.Tab('Emission lines', emission_tab_layout) ]]) ], [sg.Button('Plot responses')], [sg.Canvas(key='-CANVAS-')], [sg.Button('Exit')]] self.window = sg.Window('Choose configuration', layout) while True: event, values = self.window.read() if event is None: break if event is 'Exit': exit(0) if event is 'Check star color': config = validate_config(values) print('You entered ', config) self.get_responses(config) self.plot_star(self.get_rgb_color(config), config) self.fig.savefig("_current_star_.png") self.draw_figure(self.window['-CANVAS-'].TKCanvas) if event is 'Plot responses': config = validate_config(values) self.get_responses(config) self.window['-CANVAS-'].TKCanvas.delete("ALL") self.plot_responses(config) self.fig.savefig("_current_responses_.png") self.draw_figure(self.window['-CANVAS-'].TKCanvas) self.window.close()
#------------------------------- Beginning of GUI CODE ------------------------------- layout = [[ sg.Button('Launch visualisation'), sg.Button('Launch visualisation 2') ]] window = sg.Window('Have some Matplotlib....', layout) while True: for i in range(2): event, values = window.read(timeout=100) if event == "Launch visualisation": # define the window layout layout = [[sg.Text('Plot test', font='Any 18')], [sg.Canvas(key='canvas')], [sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))]] # create the form and show it without the plot window_graph = sg.Window( 'Demo Application - Embedding Matplotlib In PySimpleGUI', force_toplevel=False).Layout(layout).Finalize() # add the plot to the window # fig_photo = draw_figure(window_graph.FindElement('canvas').TKCanvas, fig) # show it all again and get buttons event_graph, values_graph = window_graph.Read() if event == "Launch visualisation 2": layout = [[sg.Text('Plot test', font='Any 18')],
def main(): fruit_fly_chromosomes = { 'Chromosome X': 'NC_004354.4', 'Chromosome 2L': 'NT_033779.5', 'Chromosome 2R': 'NT_033778.4', 'Chromosome 3L': 'NT_037436.4', 'Chromosome 4': 'NC_004353.4', 'Chromosome 3R': 'NT_033777.3', 'Chromosome Y': 'NC_024512.1' } menu_def = [[ '&File', [ '&Start', [ 'Drosophila Melanogaster', list(fruit_fly_chromosomes.keys()), '---', 'COVID-19' ], '---', 'E&xit' ] ], ['&Help', '&About...']] sg.theme('SystemDefault') layout = [[sg.Menu(menu_def, key='-MENU-')], [ sg.Text(size=(50, 1), font=('Helvetica', 20), key='-DESCRIPTION-'), sg.Text(size=(30, 1), font=('Helvetica', 20), key='-ENTROPY-') ], [sg.Canvas(size=(1280, 720), key='-CANVAS-')], [ sg.Slider(range=(1, 100000), default_value=100000, size=(100, 10), orientation="h", enable_events=True, key="-SLIDER-") ]] window = sg.Window("Entropy Fruit Fly", layout, return_keyboard_events=True, use_default_focus=False, resizable=True, element_justification='c', finalize=True) window['-SLIDER-'].bind('<ButtonRelease-1>', ' Release') #window.Maximize() running = False # ---===--- Loop taking in user input --- # while True: event, values = window.read(timeout=100) if event in (sg.WIN_CLOSED, 'Exit'): sg.popup_animated(None) break #print(event, values) if event == 'About...': sg.popup('Entropy Drosophila Melanogaster', 'Version 1.1', '© Davide Cerizza') if 'Chromosome' in event: window['-DESCRIPTION-'].update(fruit_fly_chromosomes[event]) event = '-SLIDER- Release' if event == 'COVID-19': window['-DESCRIPTION-'].update('NC_045512.2') event = '-SLIDER- Release' if event == '-SLIDER- Release' and not running and window[ '-DESCRIPTION-'].get() != '': sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, message='Wait..', text_color='black', background_color='white', transparent_color='white', time_between_frames=100) running = True window['-SLIDER-'].update(disabled=True) window.perform_long_operation( lambda: evaluate_entropy((window['-DESCRIPTION-'].get().split( ))[0], int(values['-SLIDER-'])), '-OPERATION DONE-') elif event == '-OPERATION DONE-': sg.popup_animated(None) running = False window['-SLIDER-'].update(disabled=False) if 'figure_canvas_agg' in locals(): figure_canvas_agg.get_tk_widget().forget() plt.close('all') plt.figure(1, facecolor="#F0F0F0", figsize=[12.8, 7.20]) plt.xlim(0, list((values[event])['entropy'].keys())[-1]) plt.step((values[event])['entropy'].keys(), (values[event])['entropy'].values()) plt.ylabel("Entropy") plt.grid(color='b', linestyle='--', linewidth=0.5) figure_canvas_agg = FigureCanvasTkAgg(plt.gcf(), window['-CANVAS-'].TKCanvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1) window['-DESCRIPTION-'].update((values[event])['description']) window['-ENTROPY-'].update('Nucleobases Entropy = %.10f' % (values[event])['totalentropy']) if running: sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, message='Wait..', text_color='black', background_color='white', transparent_color='white', time_between_frames=100) window.close()
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side="top", fill="both", expand=1) return figure_canvas_agg # ------------------------------- Beginning of GUI CODE ------------------------------- sg.theme("Light Brown 3") fig = plt.gcf() # if using Pyplot then get the figure from the plot figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds # define the window layout layout = [ [sg.Text("Plot test", font="Any 18")], [sg.Canvas(size=(figure_w, figure_h), key="-CANVAS-")], [sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))], ] # create the form and show it without the plot window = sg.Window( "Demo Application - Embedding Matplotlib In PySimpleGUI", layout, force_toplevel=True, finalize=True, ) # add the plot to the window # fig_photo = draw_figure(window['-CANVAS-'].TKCanvas, fig) # show it all again and get buttons
def Layout(self): Connect = [sg.Button("Connect or Disconnect", key="-Connect-")] SetPose = [ [ sg.Button("Set pose", size=(7, 1), key="-SetJointPose-"), sg.Button("Set pose", size=(7, 1), key="-SetCoordinatePose-"), ], [ sg.Text("J1", size=(2, 1)), sg.InputText("", size=(5, 1), key="-JointPose1-"), sg.Text("X", size=(1, 1)), sg.InputText("", size=(5, 1), key="-CoordinatePose_X-"), ], [ sg.Text("J2", size=(2, 1)), sg.InputText("", size=(5, 1), key="-JointPose2-"), sg.Text("Y", size=(1, 1)), sg.InputText("", size=(5, 1), key="-CoordinatePose_Y-"), ], [ sg.Text("J3", size=(2, 1)), sg.InputText("", size=(5, 1), key="-JointPose3-"), sg.Text("Z", size=(1, 1)), sg.InputText("", size=(5, 1), key="-CoordinatePose_Z-"), ], [ sg.Text("J4", size=(2, 1)), sg.InputText("", size=(5, 1), key="-JointPose4-"), sg.Text("R", size=(1, 1)), sg.InputText("", size=(5, 1), key="-CoordinatePose_R-"), ], ] # 画像上の位置とDobotの座標系との位置合わせを行うGUI Alignment = [[ sg.Button('MoveToThePoint', size=(16, 1), key='-MoveToThePoint-'), ], [ sg.Button('Set', size=(8, 1), key='-Record-'), sg.Button('Set', size=(8, 1), key='-Set_x1-'), sg.Button('Set', size=(8, 1), key='-Set_x2-'), ], [ sg.Text('X0', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-x0-'), sg.Text('X1', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-x1-'), sg.Text('X2', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-x2-'), ], [ sg.Text('Y0', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-y0-'), sg.Text('Y1', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-y1-'), sg.Text('Y2', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-y2-'), ], [ sg.Text('Z0', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-z0-'), ], [ sg.Text('R0', size=(2, 1)), sg.InputText('', size=(5, 1), disabled=True, key='-r0-'), ]] WebCamConnect = [ [ # Web_Cameraの接続/解放 sg.Button("WEB CAM on/off", size=(15, 1), key="-SetWebCam-"), # カメラのプレビュー sg.Button("Preview Opened", size=(11, 1), key="-Preview-"), # 静止画撮影 sg.Button("Snapshot", size=(7, 1), key="-Snapshot-"), ], [ # PCに接続されているカメラの選択 sg.InputCombo( ( "TOSHIBA_Web_Camera-HD", "Logicool_HD_Webcam_C270", ), default_value="TOSHIBA_Web_Camera-HD", size=(15, 1), key="-WebCam_Name-", readonly=True, ), # 解像度の選択 sg.InputCombo( ( "640x480", "352x288", "320x240", "176x144", "160x120", "1280x720", "1280x800", ), size=(11, 1), key="-WebCam_FrameSize-", readonly=True, ), ], [ # 画像のサイズ・チャンネル数 sg.Text("width", size=(4, 1)), sg.InputText( "0", size=(5, 1), disabled=True, justification="right", key="-IMAGE_width-", ), sg.Text("height", size=(4, 1)), sg.InputText( "0", size=(5, 1), disabled=True, justification="right", key="-IMAGE_height-", ), sg.Text("channel", size=(6, 1)), sg.InputText( "0", size=(5, 1), disabled=True, justification="right", key="-IMAGE_channel-", ), ], # 画像の色・濃度・フィルタリング [ sg.Text('色空間', size=(5, 1)), sg.InputCombo(( 'RGB', 'Glay', 'HSV', ), size=(4, 1), key='-Color_Space-', readonly=True), sg.Text('濃度変換', size=(7, 1)), sg.InputCombo( ( 'なし', '線形濃度変換', '非線形濃度変換', # ガンマ処理 'ヒストグラム平坦化', ), default_value="なし", size=(18, 1), key='-Color_Density-', readonly=True), sg.Text('空間フィルタリング', size=(16, 1)), sg.InputCombo(( 'なし', '平均化', 'ガウシアン', 'メディアン', ), size=(10, 1), key='-Color_Filtering-', readonly=True), ], ] Contours = [ [ sg.Button('Contours', size=(7, 1), key='-Contours-'), sg.InputCombo(( '画像をもとに計算', '輪郭をもとに計算', ), size=(16, 1), key='-CenterOfGravity-') ], [ sg.Text('Gx', size=(2, 1)), sg.InputText('0', size=(5, 1), disabled=True, justification='right', key='-CenterOfGravity_x-'), sg.Text('Gy', size=(2, 1)), sg.InputText('0', size=(5, 1), disabled=True, justification='right', key='-CenterOfGravity_y-'), ], ] ColorOfObject = [ [ sg.Radio('R', group_id='color', background_color='grey59', text_color='red', key='-color_R-'), sg.Radio('G', group_id='color', background_color='grey59', text_color='green', key='-color_G-'), sg.Radio('B', group_id='color', background_color='grey59', text_color='blue', key='-color_B-'), sg.Radio('W', group_id='color', background_color='grey59', text_color='snow', key='-color_W-'), sg.Radio('Bk', group_id='color', default=True, background_color='grey59', text_color='grey1', key='-color_Bk-') ], ] Bin_CommonSettings = [ [ sg.Text('閾値の処理方法'), sg.InputCombo(( 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV', ), size=(12, 1), key='-Threshold_type-', readonly=True) ], [sg.Checkbox('ヒストグラム平坦化', key='-EqualizeHist-')], [ sg.Checkbox('ガウシアンフィルタ', key='-Gaussian-'), ], ] # 画像から物体の輪郭を切り出す関数の設定部分_GUI ContourExtractionSettings = [ # 輪郭のモードを指定する [ sg.Text('輪郭', size=(10, 1)), sg.InputCombo(( '親子関係を無視する', '最外の輪郭を検出する', '2つの階層に分類する', '全階層情報を保持する', ), size=(20, 1), key='-ContourRetrievalMode-', readonly=True), ], # 近似方法を指定する [ sg.Text('近似方法', size=(10, 1)), sg.InputCombo(('中間点を保持する', '中間点を保持しない'), size=(18, 1), key='-ApproximateMode-', readonly=True), ], # カーネルの形を指定する [ sg.Text('カーネルの形', size=(10, 1)), sg.InputCombo(('矩形', '楕円形', '十字型'), size=(6, 1), key='-KernelShape-', readonly=True), ], ] # 大域的二値化 Global_Threshold = [ [ sg.Radio('Global Threshold', group_id='threshold', key='-GlobalThreshold-'), ], [ sg.Text('Threshold', size=(7, 1)), sg.InputText('127', size=(4, 1), justification='right', key='-threshold-') ], [sg.Checkbox('大津の二値化', key='-OTSU-')], ] # 適応的二値化 Adaptive_Threshold = [ [ sg.Radio('Adaptive Threshold', group_id='threshold', key='-AdaptiveThreshold-'), ], [ sg.InputCombo(('MEAN_C', 'GAUSSIAN_C'), size=(12, 1), key='-AdaptiveThreshold_type-', readonly=True) ], [ sg.Text('Block Size', size=(8, 1)), sg.InputText('11', size=(4, 1), justification='right', key='-AdaptiveThreshold_BlockSize-'), ], [ sg.Text('Constant', size=(8, 1)), sg.InputText('2', size=(4, 1), justification='right', key='-AdaptiveThreshold_constant-') ], ] # 2つの閾値を用いた二値化 TwoThreshold = [[ sg.Radio('TwoThreshold', group_id='threshold', default=True, key='-Twohreshold-'), ], [ sg.Text('Lower', size=(4, 1)), sg.Slider(range=(0, 127), default_value=10, orientation='horizontal', size=(12, 12), key='-LowerThreshold-'), ], [ sg.Text('Upper', size=(4, 1)), sg.Slider(range=(128, 256), default_value=138, orientation='horizontal', size=(12, 12), key='-UpperThreshold-') ]] layout = [ Connect, [ sg.Col(SetPose, size=(165, 136)), ], [ sg.Col(WebCamConnect), sg.Frame('画像の重心計算', Contours), ], [ sg.Image(filename='', size=(self.Image_width, self.Image_height), key='-IMAGE-'), sg.Canvas(size=(self.Image_width, self.Image_height), key='-CANVAS-') ], [ sg.Col(Global_Threshold, size=(200, 115)), sg.Col(Adaptive_Threshold, size=(200, 115)), sg.Col(TwoThreshold, size=(200, 115)), ], [sg.Quit()], ] return layout
tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) return photo #------------ Matplotlib code ---------------------- #see https://matplotlib.org/ fig = plt.figure() ax = fig.add_subplot(111) #x-values x = np.linspace(-np.pi*2, np.pi*2, 100) #y-values y = np.sin(x) plt.plot(x,y) ax.set_title('sin(x)') figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds #------------End Matplotlib code -------------------- layout = [[sg.Text('Plot Test - PySimpleGUI and Matplotlib', font = ('Calibri', 18, 'bold'))], [sg.Canvas(size = (figure_w, figure_h), key = '_canvas_')], [sg.OK(pad=((figure_w / 2, 0), 3), size=(6, 2))]] window = sg.Window('Matplot in PySimpleGUI', force_toplevel = True).Layout(layout).Finalize() fig_photo = draw_figure(window.FindElement('_canvas_').TKCanvas, fig) button, value = window.Read()
import PySimpleGUI as gui layout = [ [gui.Canvas(size=(100,100), background_color='red', key='canvas')], [gui.T('Change circle color to:'), gui.ReadFormButton('Red'), gui.ReadFormButton('Blue')] ] form = gui.FlexForm('Canvas test') form.Layout(layout) form.ReadNonBlocking() cir = form.FindElement('canvas').TKCanvas.create_oval(50, 50, 100, 100) while True: button, values = form.Read() if button is None: break if button is 'Blue': form.FindElement('canvas').TKCanvas.itemconfig(cir, fill = "Blue") elif button is 'Red': form.FindElement('canvas').TKCanvas.itemconfig(cir, fill = "Red")
backSet = set() goSet = set() gamesMapping = {} colNum = 2 for game in games: gamesMapping[game] = '-COL{}-'.format(colNum) backSet.add('-BACK{}-'.format(colNum)) goSet.add('-GO{}-'.format(colNum)) colNum += 1 backSet.add('-BACK0-') menu = [[sg.Text("Which game to simulate rolls?")], [sg.Button(game) for game in games], [sg.Button("Exit")]] graph = [[sg.Text("Results of Simulation")], [sg.Canvas(key="-CANVAS-")], [ sg.Button('Save image', key='-SAVE-'), sg.Button('Back', key='-BACK0-'), sg.Button('Exit', key='-EXIT-') ]] arknights = [[sg.Text("Unit rarity:")], [ sg.Radio('6 Star', 'RADIO1', default=True, key="-ARKRARE6-"), sg.Radio('5 Star', 'RADIO1', default=False, key="-ARKRARE5-") ], [sg.Checkbox('Rate up unit?', default=False, key="-ARKRU-")], [sg.Text("Number of rate up units:")], [ sg.Radio('1', 'RADIO5', default=True, key="-ARKRU1-"), sg.Radio('2', 'RADIO5', default=False, key="-ARKRU2-"),
photo = Tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) canvas.create_image(loc[0] + figure_w / 2, loc[1] + figure_h / 2, image=photo) tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) return photo # ------------------------------- Beginning of GUI CODE ------------------------------- fig = plt.gcf() # if using Pyplot then get the figure from the plot figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds # define the window layout layout = [[sg.Text('Plot test', font='Any 18')], [sg.Canvas(size=(figure_w, figure_h), key='canvas')], [sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))]] # create the form and show it without the plot window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout, force_toplevel=True, finalize=True) # add the plot to the window fig_photo = draw_figure(window['canvas'].TKCanvas, fig) # show it all again and get buttons event, values = window.read() window.close()
sg.Button('Fit', enable_events=True, key='-FIT-', font='Helvetica 16', size=(10, 1)) ], [ sg.Text("Gaussian noise (std. devition)", font=('Helvetica', 12)), sg.Slider(range=(0, 6), default_value=3, size=(20, 20), orientation='h', font=('Helvetica', 12), key='-NOISE-') ], [sg.Canvas(size=(350, 350), key='-CANVAS-', pad=(20, 20))], [sg.Button('Exit')], ] # Create the window window = sg.Window('Polynomial fitting', layout, size=(700, 700)) # Event loop fig_agg = None while True: event, values = window.read() if event in (sg.WIN_CLOSED, 'Exit'): break if event == '-GENERATE-': noise = values['-NOISE-'] if fig_agg is not None:
# fig = matplotlib.figure.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)) # ------------------------------- END OF YOUR MATPLOTLIB CODE ------------------------------- # ------------------------------- Beginning of Matplotlib helper code ----------------------- def draw_figure(canvas, figure): figure_canvas_agg = FigureCanvasTkAgg(figure, canvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1) return figure_canvas_agg # ------------------------------- Beginning of GUI CODE ------------------------------- # define the window layout layout = [[sg.Text('Plot test')], [sg.Canvas(key='-CANVAS-')], [sg.Button('Ok')]] # create the form and show it without the plot window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True, element_justification='center', font='Helvetica 18') # add the plot to the window fig_canvas_agg = draw_figure(window['-CANVAS-'].TKCanvas, fig) event, values = window.read() window.close()
def main(): # define the form layout layout = [[ sg.Text('Animated Matplotlib', size=(40, 1), justification='center', font='Helvetica 20') ], [sg.Canvas(size=(640, 480), key='-CANVAS-')], [sg.Canvas(key='-CANVAS2-')], [ sg.Button('Exit', size=(10, 2), pad=((280, 0), 3), font='Helvetica 14') ], [ sg.Button('Start', key="live_plot", size=(10, 2), pad=((280, 0), 3), font='Helvetica 14') ]] # create the form and show it without the plot window = sg.Window( 'Demo Application - Embedding Matplotlib In PySimpleGUI', layout, finalize=True) canvas_elem = window['-CANVAS-'] canvas2 = window['-CANVAS2-'] canvas = canvas_elem.TKCanvas # draw the intitial plot style.use("ggplot") fig, ax = plt.subplots() fig_agg = draw_figure(canvas, fig) index_number_array = [1, 2, 3, 4] zscore_array = [3, 2, 1, 0] while True: event, values = window.read(timeout=10) if event in ("Exit", sg.WIN_CLOSED): # always, always give a way out! break elif event == 'live_plot': global thread_live if not thread: thread = True threading.Thread(target=increase, args=(index_number_array, zscore_array), daemon=True).start() window['live_plot'].update("Stop") else: thread = False window['live_plot'].update("Start") #ax.cla() #ax.clear() ax.plot(index_number_array, zscore_array, color='orange') ax.set_title("Live Plot") ax.set_xlabel('Time(s)', fontsize=10) ax.set_ylabel('Z-Score', fontsize='medium') fig_agg.draw() window.close()