2016-03-01 82 views
1

作爲我平常工作的副項目,我被要求創建一個表單來收集信息。 現在腳本已經形成並基本上可以滿足所有需要,但是我想添加一個額外的功能。 基本上,我有一些由3個部件組成的字段:帶有一些問題的標籤,帶有「是」/「否」列表的下拉菜單以供選擇,以及可選的文本小部件,其中用戶可以提供額外的信息通常如果下拉列表中的選擇是「是」) 當前,文本小部件總是處於活動狀態(即用戶可以編寫我想要的所有內容),並且僅在後處理階段(由腳本創建)期間我根據下拉選擇的值收集其內容。python tkinter:使用下拉菜單啓用文本字段

這基本上沒問題,但我希望通過啓用文本小部件或不依賴於下拉列表的值來使它更具視覺吸引力。基本上,我的想法是默認禁用文本窗口小部件,並且如果用戶從下拉列表中選擇「是」,則窗口小部件變爲可編輯的。

我試圖做這樣的:

#! /bin/env python 


from Tkinter import * 
# 

my_change = "No" 


stateOpts = ['normal','disabled'] 


win_width = 610 
win_height =866 

# My frame for form 
class simpleform_ap(Tk): 

    #my_sel = "" 
    global my_change 

    # constructor 
    def __init__(self,parent): 
     Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 
    # 

    def initialize(self): 
     # 
     # Default Window Size 
     self.geometry(str(win_width) + "x" + str(win_height)) 
     # 
     self.grid_columnconfigure(0,weight=4) 
     self.grid_rowconfigure(0,weight=1) 
     # 
     # Create a Canvas 
     self.canvas=Canvas(self.parent) 
     self.canvas.grid(row=0,column=0,sticky='nsew') 
     # 
     # Add a Frame inside my canvas 
     self.frame1 = Frame(self.canvas) 
     # 
     # Create canvas window 
     self.canvas.create_window(0,0,window=self.frame1,anchor='nw') 
     # 
     curr_row = 1 
     text_height = 8 
     text_width = 5*text_height 
     # Label 
     self.labelVariableChanges = StringVar() # Label variable 
     labelChanges=Label(self.frame1,textvariable=self.labelVariableChanges, 
       anchor="nw", 
       fg="Black") 
     labelChanges.grid(column=0,row=curr_row,columnspan=1,sticky='EW') 
     self.labelVariableChanges.set("Do your selection: ") 
     # Selection 
     optionList = ["Yes","No"] 
     self.dropVarChanges=StringVar() 
     self.dropVarChanges.set("Select") 
     self.dropMenuChanges = OptionMenu(self.frame1 ,self.dropVarChanges, 
              *optionList, command=self.get_Change_selection) 
     self.dropMenuChanges.grid(column=2,row=curr_row) 
     curr_row = curr_row+1 
     # Text 
     self.textStateChanges = stateOpts[1] 
     self.TextVarChanges=StringVar() 
     # 
     self.textChanges=Text(self.frame1,state=self.textStateChanges, 
          height = text_height, width = text_width, 
          fg="black",bg="white") # ,textvariable=self.myTextVar) 
     # 
     self.textChanges.grid(column=1, row=curr_row+3, columnspan=2, sticky='EW') 
     self.textChanges.insert('1.0',"If Yes, add changes here!") 
     # 
     # 
     # Update Geometry 
     self.update() 
     self.geometry(self.geometry()) 
     self.frame1.update_idletasks() 
     self.canvas.config(scrollregion=(0,0,self.frame1.winfo_width(),self.frame1.winfo_height())) 
     # 
     # end initialize() 


    def get_Change_selection(self,value): 
     global my_change 
     # 
     my_change = value 
     if value == 'Yes': 
     # 
      self.textStateChanges = stateOpts[0] 
      # 
     self.dropVarChanges.set(value) 
     return 


def release_block(argv): 
    # Create Form 
    form = simpleform_ap(None) 
    form.title('Release Information') 
    # 
    form.mainloop() 

    print "Done" 
    # 



if __name__ == "__main__": 
    release_block(sys.argv) 

但我失敗了(基本上我與使用TKinter一個的n00b)。

我想問題是在主循環和函數來檢索選擇,但我不知道如何解決這個問題。

有沒有人有關於如何解決這個問題的想法?

在此先感謝所有願意給我提示的人。

回答

0

您可以通過調用self.textChanges.config()並將其傳遞給狀態來啓用/禁用文本窗口小部件。這相當於修改您的get_Change_selection閱讀:

def get_Change_selection(self,value): 
    global my_change 
    my_change = value 
    if value == 'Yes': 
     self.textChanges.config(state=stateOpts[0]) 
    else: 
     self.textChanges.config(state=stateOpts[1]) 
    self.dropVarChanges.set(value) 

    return 

如果您想在默認情況下禁用字段,添加一個電話在構造函數中的配置來禁用它。完成這些更改後,您的代碼將如下所示:

from Tkinter import * 
# 

my_change = "No" 


stateOpts = ['normal', 'disabled'] 


win_width = 610 
win_height =866 

# My frame for form 
class simpleform_ap(Tk): 

    #my_sel = "" 
    global my_change 

    # constructor 
    def __init__(self,parent): 
     Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 
    # 

    def initialize(self): 
     # 
     # Default Window Size 
     self.geometry(str(win_width) + "x" + str(win_height)) 
     # 
     self.grid_columnconfigure(0,weight=4) 
     self.grid_rowconfigure(0,weight=1) 
     # 
     # Create a Canvas 
     self.canvas=Canvas(self.parent) 
     self.canvas.grid(row=0,column=0,sticky='nsew') 
     # 
     # Add a Frame inside my canvas 
     self.frame1 = Frame(self.canvas) 
     # 
     # Create canvas window 
     self.canvas.create_window(0,0,window=self.frame1,anchor='nw') 
     # 
     curr_row = 1 
     text_height = 8 
     text_width = 5*text_height 
     # Label 
     self.labelVariableChanges = StringVar() # Label variable 
     labelChanges=Label(self.frame1,textvariable=self.labelVariableChanges, 
          anchor="nw", 
          fg="Black") 
     labelChanges.grid(column=0,row=curr_row,columnspan=1,sticky='EW') 
     self.labelVariableChanges.set("Do your selection: ") 
     # Selection 
     optionList = ["Yes","No"] 
     self.dropVarChanges=StringVar() 
     self.dropVarChanges.set("Select") 
     self.dropMenuChanges = OptionMenu(self.frame1 ,self.dropVarChanges, 
              *optionList, command=self.get_Change_selection) 
     self.dropMenuChanges.grid(column=2,row=curr_row) 
     curr_row = curr_row+1 
     # Text 
     self.textStateChanges = stateOpts[1] 
     self.TextVarChanges=StringVar() 
     # 
     self.textChanges=Text(self.frame1,state=self.textStateChanges, 
           height = text_height, width = text_width, 
           fg="black",bg="white") # ,textvariable=self.myTextVar) 
     # 
     self.textChanges.grid(column=1, row=curr_row+3, columnspan=2, sticky='EW') 
     self.textChanges.insert('1.0',"If Yes, add changes here!") 
     self.textChanges.config(state=stateOpts[1]) 
     # 
     # 
     # Update Geometry 
     self.update() 
     self.geometry(self.geometry()) 
     self.frame1.update_idletasks() 
     self.canvas.config(scrollregion=(0,0,self.frame1.winfo_width(),self.frame1.winfo_height())) 
     # 
     # end initialize() 


    def get_Change_selection(self,value): 
     global my_change 
     my_change = value 
     if value == 'Yes': 
      self.textChanges.config(state=stateOpts[0]) 
     else: 
      self.textChanges.config(state=stateOpts[1]) 
     self.dropVarChanges.set(value) 

     return 


def release_block(argv): 
    # Create Form 
    form = simpleform_ap(None) 
    form.title('Release Information') 
    # 
    form.mainloop() 

    print("Done") 
    # 



if __name__ == "__main__": 
    release_block(sys.argv) 
+0

非常感謝! – Jackkilby