<p>我不确定您要做什么,但有一个问题是,您在<code>askUser()</code>方法中创建的名为<code>cbVar</code>的<code>TK.IntVar</code>将在函数返回时被删除,因此您需要将其附加到某个在该函数返回后仍然存在的东西上。虽然可以将其作为全局变量,但更好的选择是使其成为更持久的属性,并且“寿命”更长。在</p>
<p>另一个可能的问题是,在一个<code>Tkinter</code>应用程序中,通常只应该有一个对<code>mainloop()</code>的调用。看来您要做的是显示通常称为<em>对话框窗口</em>,Tkinter也支持它。有一些标准的内置类,加上一些更通用的类来简化自定义类的创建。这里有一些我发现的<a href="http://effbot.org/tkinterbook/tkinter-dialog-windows.htm" rel="nofollow noreferrer">documentation</a>详细描述了它们。您可能还发现查看它们的源代码很有帮助。
在python2中,它位于<a href="https://hg.python.org/cpython/file/2.7/Lib/lib-tk/tkSimpleDialog.py" rel="nofollow noreferrer">/Lib/lib-tk/tkSimpleDialog.py</a>文件中,并且
在python3中,代码位于一个名为<a href="https://hg.python.org/cpython/file/3.6/Lib/tkinter/simpledialog.py" rel="nofollow noreferrer">/Lib/tkinter/simpledialog.py</a>的文件中。在</p>
<p>下面的代码采用后一种方法,并从包含Tkinter库的通用类派生一个名为<code>GUIButtonDialog</code>的自定义对话框类,该类仅名为<code>Dialog</code>。在</p>
<pre><code>try:
import Tkinter as Tk # Python 2
from tkSimpleDialog import Dialog
except ModuleNotFoundError:
import tkinter as Tk # Python 3
from tkinter.simpledialog import Dialog
class GUIButtonDialog(Dialog):
"""Custom one Button dialog box."""
def __init__(self, btnText, parent=None, title=None):
self.btnText = btnText
Dialog.__init__(self, parent, title)
def getCheckVal(self):
print(self.cbVar.get())
def body(self, master):
"""Create dialog body."""
self.cbVar = Tk.IntVar()
self.btnC = Tk.Checkbutton(master, text=self.btnText, variable=self.cbVar,
command=self.getCheckVal)
self.btnC.grid()
return self.btnC # Return the widget to get inital focus.
def buttonbox(self):
# Overridden to suppress default "OK" and "Cancel" buttons.
pass
class GUIMainClass:
def __init__(self):
"""Create the main window."""
self.window = Tk.Tk()
def askUser(self):
"""Display custom dialog window (until user closes it)."""
GUIButtonDialog("Save", parent=self.window)
def cmdWindow(self):
frameShow = Tk.Frame(self.window)
frameShow.grid()
btnSwitch = Tk.Button(frameShow, text='Show Plots', command=self.askUser)
btnSwitch.grid()
self.window.mainloop()
GUIObj = GUIMainClass()
GUIObj.cmdWindow()
</code></pre>