2017-04-21 31 views
1

對於這個GUI的名單上有五個對象:全名,聯繫方式,所需的語言,難度等級,並與語言的經驗。我對這項任務的設計是,它是一個簡單的「外文書店請求管理器」,我可以在其中添加,編輯和刪除外文書籍的請求。是/ GUI中沒有checkbutton爲布爾屬性來管理對象

我希望前四個對象是Entry字段,然後第五個(經驗)是一個複選框,對於這個數據屬性,我想讓它成爲代表是/否狀態的布爾值,以表示是否有經驗用他們要求的語言。

從我的教科書和前面的例子中,我可以創建一個基本的y/n複選框,但是它出現在我的窗口的頂部,我被困在如何編寫它以便體驗數據屬性是檢查按鈕爲布爾屬性,而不是一個條目的形式和,無論被選中(是或否/它是否是真或假)當我使用STR方法,使用ListboxSelect以顯示每個屬性的值出現。

當我試圖將第五個屬性與其餘屬性分開以便它是一個複選框而不是Entry表單時,我無法運行我的程序,並且在嘗試創建bool屬性時我遇到了錯誤,並且不確定是否需要先修復布爾屬性或複選框,是否他們攜手共處等

我的問題是: 1)我是否使用正確的格式爲bool屬性創建y/n複選框? 2)如何編寫複選框,使其顯示在體驗標籤旁邊,而不是當前寫入的輸入表單?

我很抱歉,如果這是非常愚蠢的問,但我花了7個小時試圖解決這些問題,並沒有想出我做錯了什麼,以及如何更正和添加什麼是必要的,以完成這個程序。

與檢查按鈕無關,使用ListboxSelect小部件,它顯示的對象位於我正在查找的地址處,但並未實際顯示我以爲我寫過的內容,它會顯示: 'Full Name:,Contact info:,語言:,難度:,語言經驗:(然後這裏是布爾屬性的複選框,我還沒有弄清楚)'在我的程序的Book Requests部分。我包括我的程序和當前問題的圖片以及一些代碼。 does not display what I had thought I had written

import tkinter 
import request 

class Application: 
    def __init__(self): 
     self.__requests = [] 
     self.__selected_index = 0 
     self.__selected_request = None 

     self.__window = tkinter.Tk() 
     self.__window.title('Foreign Language Bookstore Request Manager') 

     self.__full_name = tkinter.StringVar() 
     self.__contact_info = tkinter.StringVar() 
     self.__language = tkinter.StringVar() 
     self.__difficulty = tkinter.StringVar() 
     self.__experience = tkinter.StringVar() 

     self.cb_var1 = tkinter.IntVar() 
     self.cb_var2 = tkinter.IntVar() 

     self.cb_var1.set(0) 
     self.cb_var2.set(0) 

     self.cb1 = tkinter.Checkbutton(self.__window, \ 
             text='Yes', variable=self.cb_var1) 
     self.cb2 = tkinter.Checkbutton(self.__window, \ 
             text='No', variable=self.cb_var2) 

     self.cb1.pack() 
     self.cb2.pack() 



     self.build_input_frame('Full Name: ', self.__full_name) 
     self.build_input_frame('Contact info (phone, email): ', self.__contact_info) 
     self.build_input_frame('Desired language: ', self.__language) 
     self.build_input_frame('Difficulty level 1- beginner, 2- intermediate, 3- advanced: ', self.__difficulty) 
     self.build_input_frame('Experience with language? ', self.__experience) 

     frame = tkinter.Frame(self.__window) 
     self.__add_button = tkinter.Button(frame, text='Add Request', 
      anchor=tkinter.W, command=self.add_request) 
     self.__add_button.pack(side='left') 
     self.__save_button = tkinter.Button(frame, text='Save Request', 
      anchor=tkinter.W, command=self.save_request, state=tkinter.DISABLED) 
     self.__save_button.pack(side='left') 
     self.__delete_button = tkinter.Button(frame, text='Delete Request', 
      anchor=tkinter.W, 
      command=self.delete_request, state=tkinter.DISABLED) 
     self.__delete_button.pack() 
     frame.pack() 

     frame = tkinter.Frame(self.__window) 
     label = tkinter.Label(frame, text='Book Requests') 
     self.__requests_list = tkinter.Listbox(frame, width=80, 
      selectmode=tkinter.SINGLE) 

     self.__requests_list.bind('<<ListboxSelect>>', self.select_request) 
     label.pack() 
     self.__requests_list.pack() 
     frame.pack() 

    def build_input_frame(self, label, textvariable): 
     """Build the top frames of the window for being able to enter data.""" 
     frame = tkinter.Frame(self.__window) 
     label = tkinter.Label(frame, text=label, width=50, anchor=tkinter.W) 
     entry = tkinter.Entry(frame, textvariable=textvariable, width=30) 
     label.pack(side='left') 
     entry.pack(side='right') 
     frame.pack() 

    def add_request(self): 
     """Get the values from the bound variables and create a new Request.""" 
     r = request.Request(self.__full_name.get(), self.__contact_info.get(), 
      self.__language.get(), self.__difficulty.get(), 
          self.__experience.get()) 
     self.__requests.append(r) 

     self.__requests_list.insert(tkinter.END, str(r)) 

    def select_request(self, event): 
     """Get the Request at the index selected, and set the Entry fields 
      with its values.""" 
     # Get the current selection from the Listbox. curselection() returns 
     # a tuple and we want the first item 
     # Get the current selection from the Listbox. curselection() returns 
     # a tuple and we want the first item 
     current_selection = self.__requests_list.curselection() 
     if current_selection: 
      self.__selected_index = current_selection[0] 

      # Grab the Request object from self.__request at that index 
      self.__selected_request = self.__requests[self.__selected_index] 

      # Use it's values to set the StringVars 
      self.__full_name.set(self.__selected_request.get_full_name()) 
      self.__contact_info.set(self.__selected_request.get_contact_info()) 
      self.__language.set(self.__selected_request.get_language()) 
      self.__difficulty.set(self.__selected_request.get_difficulty()) 
      self.__experience.set(self.__selected_request.get_experience()) 

      # Make sure the Save button is enabled 
      self.__save_button.config(state=tkinter.NORMAL) 
      self.__delete_button.config(state=tkinter.NORMAL) 


    def delete_request(self): 
     """Remov the Request at the index selected then set the Entry fields 
      to empty values.""" 
     if 0 <= self.__selected_index < len(self.__requests): 
      del self.__requests[self.__selected_index] 
      self.__requests_list.delete(self.__selected_index) 

      # Call the method to deselect the item, clear Entry fields, and 
      # disable buttons. 
      self.after_selected_operation() 

    def save_request(self): 
     """Set the selected Request's fields and then persist its __str__ 
      representation to the Listbox.""" 
     self.__selected_request.set_full_name(self.__full_name.get()) 
     self.__selected_request.set_contact_info(self.__contact_info.get()) 
     self.__selected_request.set_language(self.__language.get()) 
     self.__selected_request.set_difficulty(self.__difficulty.get()) 
     self.__selected_request.set_experience(self.__experience.get()) 

     # Listbox widgets don't have a way of updating an item in place. So 
     # We'll delete the item at a particular index and then add it 
     self.__requests_list.delete(self.__selected_index) 
     self.__requests_list.insert(self.__selected_index, 
      str(self.__selected_request)) 

     # Call the method to deselect the item, clear Entry fields, and 
     # disable buttons. 
     self.after_selected_operation() 

    def after_selected_operation(self): 
     """Clear the selected index, request, and disable buttons.""" 
     self.__selected_index = -1 
     self.__selected_request = None 

     self.__full_name.set('') 
     self.__contact_info.set('') 
     self.__language.set('') 
     self.__difficulty.set('') 
     self.__experience.set('') 

     # Make sure the Save and Delete buttons are disabled 
     self.__save_button.config(state=tkinter.DISABLED) 
     self.__delete_button.config(state=tkinter.DISABLED) 
+0

你如何運行腳本?當我運行它時,我得到一個空白窗口 – davedwards

回答

0

而不是使用Checkbutton的,最好是在這裏使用Radiobutton,爲您提供一個是/否的選擇。您可以使用Checkbutton,但在這種情況下僅提供一個效率更高。然後你也可以實現你想要的程序結構。

try: 
    import Tkinter as tk 
except ImportError: 
    import tkinter as tk 


class Window(tk.Tk): 
    def __init__(self): 
     # This is better practice when using Tkinter windows 
     # as this is a true OOP GUI implementation 
     tk.Tk.__init__(self) 
     self.boolean_var = tk.BooleanVar() 
     self.option_yes = tk.Radiobutton(self, text="Yes", variable=self.boolean_var, 
             value=True, command=self.callback) 
     self.option_no = tk.Radiobutton(self, text="No", variable=self.boolean_var, 
             value=False, command=self.callback) 
     self.option_yes.grid(row=0, column=0) 
     self.option_no.grid(row=0, column=1) 

    def callback(self): 
     print self.boolean_var.get() 


Window().mainloop() 

這種方法還可以防止既肯定又否定被同時選擇,並且在某種程度上更高效的內存,你只需要使用一個BooleanVar對象。至於佈局問題,使用您提供的代碼進行故障排除相當困難。但是,如果您需要使用十個以上的小部件來創建更復雜的佈局,我建議使用grid幾何管理器,因爲稍後可以更輕鬆地管理佈局並添加更多小部件。這個幾何管理器的一個很好的解釋和參考可以找到here。我發現它在過去非常有用。

相關問題