我有一個包含 Matplotlib 條形圖的 PySimpleGUI 視窗。我最近向它添加了一個事件,允許用戶單擊一個欄并訪問基于欄標簽的功能。這很好用……直到我在非 matplotlib 區域(例如我的 PSG 按鈕)中單擊一下。在做了一些測驗之后,這個問題似乎只有在我呼叫一個新的、不同的視窗函式作為 on_click 事件函式運行的結果時才會發生。在我的示例中,如果我洗掉 another_window(),則單擊列印條形名稱或點擊 PSG 中的按鈕不會出現問題。問題是我需要觸發其他視窗并能夠回傳到正常運行的主視窗。我做錯了什么?提前致謝!
import PySimpleGUI as sg
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib import pyplot as plt
from matplotlib.backend_bases import MouseButton
class Toolbar(NavigationToolbar2Tk):
def __init__(self, *args, **kwargs):
super(Toolbar, self).__init__(*args, **kwargs)
def on_click(event):
ax = event.inaxes
x = event.xdata
lbls = ax.get_xticklabels()
idx = int(x.round())
lbl = lbls[idx]
print('bar name is ', lbl.get_text())
another_window()
def draw_figure(canvas, figure, canvas_toolbar, loc=(0, 0)):
if canvas.children:
for child in canvas.winfo_children():
child.destroy()
if canvas_toolbar.children:
for child in canvas_toolbar.winfo_children():
child.destroy()
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.draw()
toolbar = Toolbar(figure_canvas_agg, canvas_toolbar)
toolbar.update()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg
def data():
fig, ax = plt.subplots(figsize=(20,9), dpi=100)
width = 0.95
ax.tick_params(axis='x', labelrotation = 90, labelright=True)
ax.set_ylabel('Stock Quantity')
for x in range(5):
bar_name = x
bar_qty = x
ax.bar(bar_name, bar_qty, width, color='red', label='Quantity')
plt.subplots_adjust(top = 1, bottom = .15, right = 1, left = .03, hspace = 0, wspace = 0)
plt.margins(0,0)
plt.margins(x=0)
return fig
def another_window():
layout = [[sg.T('Hello')]]
window = sg.Window(layout=layout, title='', size=(100,100))
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Exit':
window.Close()
break
def main():
team_buttons = [[sg.T('Options', text_color='black', font = 'Arial 18')],
[sg.Button('Store Inventory', size = (17,1), font = 'Arial 14', k='-STORE BUTTON1-'),
sg.Button('Retrieve Inventory', size = (17,1), font = 'Arial 14', k='-RETRIEVE BUTTON1-'),
sg.Button('Exit', button_color = '#36454f', size = (17,1), font = 'Arial 14', k='-EXIT BUTTON1-')]]
layoutMain = [[sg.Canvas(key=('-controls_cv-'))],
[sg.Column(team_buttons, visible=True),],
[sg.Canvas(size=(1920, 800), pad=((0,0),(0,0)), key='-CANVAS-', expand_x = True, expand_y = False, border_width = 50)]]
windowMain = sg.Window('E-Stock', layoutMain, no_titlebar=False, size=(1920,1080), finalize=True, resizable=True)
windowMain.maximize()
fig = data()
fig_photo = draw_figure(windowMain['-CANVAS-'].TKCanvas, fig, windowMain['-controls_cv-'].TKCanvas)
cid = fig.canvas.mpl_connect('button_press_event', on_click)
while True:
event, values = windowMain.read()
if event == '-STORE BUTTON1-':
print('store part')
if event == '-RETRIEVE BUTTON1-':
print('retrieve part')
if event == sg.WIN_CLOSED or event == 'Exit' or event == '-EXIT BUTTON1-':
windowMain.Close()
break
main()
uj5u.com熱心網友回復:
不知道有什么問題fig.canvas.mpl_connect。我的建議不是在事件處理程式中創建一個新視窗,而是為新視窗生成一個到 main_window 的事件。
def on_click(event, win):
ax = event.inaxes
x = event.xdata
lbls = ax.get_xticklabels()
idx = int(x.round())
lbl = lbls[idx]
print('bar name is ', lbl.get_text())
win.write_event_value('Another', None)
cid = fig.canvas.mpl_connect('button_press_event', lambda event, win=windowMain:on_click(event, win))
while True:
event, values = windowMain.read()
if event == '-STORE BUTTON1-':
print('store part')
if event == '-RETRIEVE BUTTON1-':
print('retrieve part')
if event == sg.WIN_CLOSED or event == 'Exit' or event == '-EXIT BUTTON1-':
windowMain.Close()
break
elif event == 'Another':
another_window()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/381775.html
標籤:Python matplotlib pysimplegui
