丑陋的:在python2.7/T中从Boolean设置CheckBox的值

2024-10-01 01:41:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的程序中有一个布尔标志,它可以在启动时从命令行设置,也可以在程序运行时从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的部分似乎过于复杂:

^{pr2}$

在我看来,这里应该有更像:

def __init__(self, parent, verbose):
  self.verbose = verbose
  …

这里的问题是,这两个CheckBoxes在变量(类型为Tkinter.BooleanVar)上正确同步,但是每次从我的代码访问另一个self.verbose变量,这是一个正常的Boolean。在

有什么办法美化这座丑陋的建筑吗?在


Tags: fromimportselfparserverbosetkinterdefusage
1条回答
网友
1楼 · 发布于 2024-10-01 01:41:58

不能只将布尔值传递给复选框,因为布尔值是不可变的。您必须以某种方式从复选框中获取新值,而且由于您还同步了两个独立的小部件,BooleanVar是正确的方法。在

但是,可以替换块

self.verbose = BooleanVar()
if verbose:
    self.verbose.set(True)
else:
    self.verbose.set(False)

只有台词

^{pr2}$

相关问题 更多 >