2015-09-10 62 views
0

我想在我的程序中有一個布爾標誌,它可以在啓動時從命令行設置,也可以在程序運行時從GUI設置。醜:在Python中設置CheckBox的值布爾值在Python2.7/Tk

我使用OptParser解析命令行中的選項,並將其作爲變量放入表示GUI的類中。問題似乎是CheckBox需要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 = BooleanVar() 
    if verbose: 
    self.verbose.set(True) 
    else: 
    self.verbose.set(False) 

...

我認爲這裏應該有一些看起來更像是:

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

這裏的問題是,這兩個CheckBoxes正確同步了(Tkinter.BooleanVar型)的變量,但是從我的代碼每隔訪問似乎訪問另一個self.verbose變量,它是一個正常的Boolean

有什麼辦法來美化這個醜陋的建築?

回答

1

您不能只傳遞布爾值到複選框,因爲布爾值是不可變的。您必須以某種方式從複選框中獲取新值,並且由於您還在同步兩個獨立的小部件,因此BooleanVar是正確的選擇。

你可以,但是,只有行

self.verbose = BooleanVar(value=verbose) 
+0

所以我的猜測是正確的)替代塊

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

- :至少現在它只有一條線... – pando