我想在我的程序中有一个布尔标志,它可以在启动时从命令行设置,也可以在程序运行时从GUI设置。在
我使用OptParser
来解析命令行中的选项,并将其作为变量提供给表示GUI的类。问题似乎是复选框需要一个Tkinter.BooleanVar
才能正常工作。在
这是一个最小的工作示例
#!/usr/bin/python
# -*- coding: UTF-8 -*
from __future__ import print_function
from Tkinter import *
from optparse import OptionParser
class CheckBox:
def __init__(self, parent, verbose):
self.verbose = BooleanVar()
if verbose:
self.verbose.set(True)
else:
self.verbose.set(False)
myParent = parent
menubar = Menu(myParent)
myParent.config(menu=menubar)
menubar.add_checkbutton(label="Toggle Verbose",
variable=self.verbose,
)
menubar.add_command(label="Check Verbose", command=self.checkVerbose)
checkVerbose = Button(text="Check Verbose", command=self.checkVerbose)
checkVerbose.pack()
chk = Checkbutton(text="Toggle Verbose",
variable=self.verbose,
onvalue=TRUE,
offvalue=FALSE,
)
chk.pack()
def checkVerbose(self):
print(self.verbose.get())
if __name__ == '__main__':
usage = "usage: %prog [options]"
parser = OptionParser(usage=usage, version="%prog v0.1.x")
parser.add_option('-v', '--verbose',
action='store_true',
dest='verbose',
help='enables output to command line'
)
parser.set_defaults(verbose=False)
(options, args) = parser.parse_args()
# start the program
root = Tk()
CheckBox(root, options.verbose)
root.mainloop()
exit(0)
代码按这里的方式工作,但我觉得我做错了什么,因为我设置self.verbose
的部分似乎过于复杂:
在我看来,这里应该有更像:
def __init__(self, parent, verbose):
self.verbose = verbose
…
这里的问题是,这两个CheckBoxes
在变量(类型为Tkinter.BooleanVar
)上正确同步,但是每次从我的代码访问另一个self.verbose
变量,这是一个正常的Boolean
。在
有什么办法美化这座丑陋的建筑吗?在
不能只将布尔值传递给复选框,因为布尔值是不可变的。您必须以某种方式从复选框中获取新值,而且由于您还同步了两个独立的小部件,
BooleanVar
是正确的方法。在但是,可以替换块
只有台词
^{pr2}$相关问题 更多 >
编程相关推荐