我一直在使用matplotlib和tkinter为基于GUI的绘图仪编写程序。我为一些选项添加了一个顶层窗口。我想执行一个函数并在单击按钮后退出顶层窗口。这可能吗?
我面临的问题是我使用了一个必须从主窗口调用的顶层窗口。所以我定义了一个包含这个顶层窗口的函数。如果我定义了另一个可以执行多个操作的函数,则无法识别顶层窗口。我可以在一个类下定义它,但我不确定它是否有效。这是我的代码的一部分,其中包含顶层窗口。
def plt_options(arg):
global lg_var,col_var,line_type_var,marker_var
plt_opt = Toplevel(app)
lg_var = StringVar(None)
lg_text = Label(plt_opt,text='Legend').grid(row=0,column=0,sticky=E)
lg_box = Entry(plt_opt,textvar=lg_var)
lg_box.grid(row=0,column=1,sticky=W)
col_var = StringVar(None)
col_var.set('blue')
col_text = Label(plt_opt,text='Color').grid(row=1,column=0)
col_chooser = OptionMenu(plt_opt,col_var,'blue','green','red','cyan',\
'magneta','yellow','black','white')
col_chooser.grid(row=1,column=1)
line_type_var = StringVar(None)
line_type_var.set('Solid')
line_type_text = Label(plt_opt,text='Line type').grid(row=2,column=0)
line_chooser = OptionMenu(plt_opt,line_type_var,'Solid','Dashed',\
'Dotted','Dash-Dotted','None')
line_chooser.grid(row=2,column=1)
marker_var = StringVar(None)
marker_var.set('None')
marker_text = Label(plt_opt,text='Marker').grid(row=3,column=0)
marker_chooser = OptionMenu(plt_opt,marker_var,'Plus','Dot','Circle',\
'Star','Pentagon','Square','Cross','Diamond','Hexagon','Triangle')
marker_chooser.grid(row=3,column=1)
ok_btn = Button(plt_opt,text='OK',command=testing).grid()
答案 0 :(得分:2)
按钮的command
选项允许您指定按下按钮时将调用的函数/方法/可调用对象。
from Tkinter import *
def buttonClicked(event):
do_a_thing()
do_another_thing()
do_a_third_thing()
#etc
root = Tk()
myButton = Button(root, text="Do Some Things", command=buttonClicked)
myButton.pack()
root.mainloop()
您可以通过调用destroy
方法退出窗口。
您似乎还有另一个问题,即如果您不在创建窗口的范围内,则无法从回调函数内部销毁顶级窗口。如果您不想仅仅为了保存对窗口的引用来定义整个类,则可以嵌套函数定义:
from Tkinter import *
def makeMyWindow():
root = Tk()
def buttonClicked():
print "Reticulating Splines..."
print "Done. Goodbye!"
#we can access root since we're inside the right scope,
#even if this function gets passed somewhere else as a callback
root.destroy()
myButton = Button(root, text="Do Some Things", command=buttonClicked)
myButton.pack()
root.mainloop()
makeMyWindow()
答案 1 :(得分:2)
按钮就是为此而设计的。通常,您将定义一个可以执行任何操作的函数或方法,然后将该方法分配给按钮的command
属性:
import Tkinter as tk
import tkMessageBox
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
button = tk.Button(text="Press me!", command=self.on_button)
button.pack()
def on_button(self):
tkMessageBox.showinfo(message="Good-bye!")
self.destroy()
app = SampleApp()
app.mainloop()