我的目标是制作交互式条形图。我想打开一个包含文本的窗口。当用户单击其中一个栏时,将发生这种情况。我开始玩了一些。在以下示例中,如果单击左栏,则会弹出一个包含文本的窗口。我有问题,我只想让窗户打开一次。因此,如果您再次单击左侧栏上的,我不想打开第二个窗口。因此,我的问题是,如何检查该窗口是否已存在并避免使用多个相同类型的窗口。我已经找到了有关该主题的帖子,但是我不理解该解决方案,该解决方案的解释不充分。
非常感谢您的帮助。
def on_press(event):
cont,att = rect[0].contains(event)
if cont == True:
win = tk.Tk()
label1 = ttk.Label(win, text ="Test1").grid(column=0,row=0)
label2 = ttk.Label(win, text ="Test2").grid(column=0,row=1)
label3 = ttk.Label(win, text ="Test3").grid(column=0,row=2)
fig = plt.figure()
ax = fig.add_subplot(111)
x = [1,2,3]
y = [10,20,5]
rect = ax.bar(x,y)
test = rect[0].figure.canvas.mpl_connect('button_press_event', on_press)
plt.show()
答案 0 :(得分:0)
与此同时,我找到了解决问题的方法。就像MediaEU所说的那样,我使用一个设置为true或false的变量。但是,一个重要的“技巧”是使用state()方法。 如果打开主窗口,则state()返回'normal'。如果主窗口关闭,则state()会引发异常。作为初学者,花了我很多时间弄清楚了。 这是我的建议:
class info_window:
def __init__(self, rect): # has an argument rect, for a specific bar in your plot
self.rect = rect
self.win_open = False
self.state = 'normal'
self.temp = self.rect.figure.canvas.mpl_connect('button_press_event', self)
def label(self):
self.label1 = ttk.Label(self.win, text ="Test1").grid(column=0,row=0)
self.label2 = ttk.Label(self.win, text ="Test2").grid(column=0,row=1)
self.label3 = ttk.Label(self.win, text ="Test3").grid(column=0,row=2)
def __call__(self, event):
cont, att = self.rect.contains(event)
try: # here is the "trick", in case window was closed self.win.state() throws an exception
self.win.state()
except: # setting win_open to False ensures that a window can be opened again
self.win_open = False
if cont == True:
if self.win_open == False: # if window does not exist, create it
self.win = tk.Tk()
self.label()
self.win_open = True # as long as window is open, you can't create it again