2015-10-05 109 views
1

我目前正在一個類中使用Tkinter的GUI。我希望GUI根據以前的選擇向用戶詢問各種輸入。另外,我會注意到我對python比較陌生,絕對是Tkinter。不過,我之前已經在MATLAB中製作了GUI。Tkinter事件小部件

所以,我想要做的是以下幾點:

  1. 要求用戶提供速度來處理,用逗號分隔。然後用戶將輸入如下所示的速度:[90,100,102p5]。
    • 要從條目中獲得輸入,您必須按Enter鍵,該鍵將調用函數以獲取速度字符串。然後我輸入輸入的字符串並根據逗號分隔它們以形成一個列表。
  2. 然後,一旦輸入速度,我想更新GUI並顯示每個速度的輸入部分,以逗號分隔的特定速度輸入各種壓力。壓力將以[100kpa,200kpa,300kpa,400kpa]的形式出現。
    • 要獲得爲每個壓力輸入的值,必須在每個輸入框中按enter鍵,就像之前一樣。我再次將這個字符串形成一個壓力列表。

,我有工作的方法,但是我不認爲這是最好的做法。這是查看輸入各種速度時GUI的外觀的鏈接,如步驟1中所述:GUI Image

最終,在此GUI的最後,我希望有一個速度列表,並且對於每個速度a壓力清單。然後,我將採取這些列表,並讓他們到另一個功能來運行我以前創建的程序。

有一點需要注意的是,我不知道用戶需要處理多少速度。我也不知道每種速度會輸入多少壓力。

所以,這些是我的問題: 這是用Tkinter處理事件的「pythonic」方式嗎?我沒有在網上找到任何關於如何根據上一個完成(通過按Enter鍵)顯示一個新小部件的任何信息。

我也不是100%確定在不同方法之間傳遞變量的最佳方法是通過使變量成爲自身屬性。例如,我如何傳遞「speeds」變量和字典「bp」。我應該使用全局變量嗎?它也變得複雜,因爲我必須通過一個事件來傳遞變量,這個事件不允許額外的參數。

非常感謝您的幫助!如果你知道一個很好的網站,以更有用的方式解釋Tkinter,那也會有幫助!

from Tkinter import * 
import tkMessageBox 


class MyWindow(Frame): 
    def __init__(self, master): 
      self.speeds = [] 
      Frame.__init__(self, master) 
      self.speed_widgets() 

    def speed_widgets(self): 
      label = Label(self.master, text="Enter the speeds you want to process, seperated by a comma:") 
      label = label.grid(row=0) 
      self.speeds_text = Entry(self.master) 
      self.speeds_text.grid(row=0, column=1) 
      self.speeds_text.bind('<Return>', self.get_speeds) 


    def get_speeds(self, event): 
      #global speeds 
      self.speeds = self.speeds_text.get() 
      if (not self.speeds): 
        tkMessageBox.showerror('Invalid Entry','Please enter at least one speed.') 
      else: 
        self.speeds = ''.join(self.speeds.split()) 
        self.speeds = self.speeds.split(',') 
        num_speeds = len(self.speeds) 
        #print speeds 
      self.bp_widget() 


    def bp_widget(self): 
      keys = [] 
      for speed in self.speeds: 
        keys.append(speed) 
      self.bp = dict.fromkeys(keys) 

      label = Label(self.master, text='Enter the back pressures for each speed, seperated by a comma:') 
      label = label.grid(row=1) 

      i = 2 
      self.bp_text_widgets = [] 
      for speed in self.speeds: 
        label = Label(self.master, text=speed+'=') 
        label.grid(row=i, column=0) 

        self.bp_text_widgets.append(Entry(self.master)) 
        self.bp_text_widgets[i-2].grid(row=i,column=1) 
        self.bp_text_widgets[i-2].bind('<Return>', lambda event, arg=i: self.get_bp(event, arg)) 
        i += 1 

    def get_bp(self, event, i): 
      self.bp[self.speeds[i-2]] = self.bp_text_widgets[i-2].get() 
      print self.bp[self.speeds[i-2]] 


root = Tk() 
MyWindow(root) 
root.mainloop() 
+0

tkinter的一個很棒的網站:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html – saulspatz

+0

'self.speed_widgets()def speed_widgets(self):'是一行語法錯誤。請發佈工作代碼,或者至少需要編譯的代碼。 – saulspatz

+0

謝謝你的鏈接!對於格式問題感到抱歉 - 當我將代碼從vi複製到本網站時必定發生。我確實修復了它。 – elmons13

回答

0

關於全局變量的問題很容易回答。一般來說,最好避免它們。從我看到的情況來看,將價值保存爲屬性是絕大多數人會這樣做的方式。

至於你對輸入小部件做了什麼,我看到了一些問題。首先,如果我在第一個窗口小部件中輸入五個速度,然後按Enter,則會出現五個新的窗口小部件。到現在爲止還挺好。但是,如果我現在意識到我犯了一個錯誤並返回並刪除速度,我仍然有5個輸入小部件。我玩過這個,添加和刪除速度,我可以將GUI全部弄亂。

其次,如果我在添加背壓後忘記按Enter鍵,或者如果我在背壓中糾正了一個錯誤,然後忘記按下Enter,會發生什麼?問題是我只看到輸入,並且沒有確認應用程序實際收到的內容。

這可能是一種品味問題,但我喜歡做的是在可能的情況下彈出一個用於輸入數據的對話框並在GUI中的某處回顯輸入數據。所以,我會有一個標有「輸入速度」的按鈕,彈出一個對話框,讓用戶輸入速度。當他點擊確定後,將會創建一個標籤,其中包含文字「速度70 80 90」。標籤旁邊會出現一個「編輯」按鈕,以防使用改變主意或想要輸入新問題。

對於每個速度,我會彈出一個對話框,其中包含如下指令:「輸入速度80的壓力」。當用戶單擊確定時,標籤將顯示相關數據和編輯按鈕。

如果我理解你是正確的,未使用的條目堅持的原因是你不知道如何讓它們消失。查找grid_forget方法。例如:

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-methods.html

我希望我已經解決您的問題。讓我知道我是否錯過了一些東西。

編輯:至於什麼是做「控制流」的「最佳方式」,當然,我沒有答案。就我個人而言,我喜歡讓方法做一件事並返回。我將有另一個函數負責以正確的順序調用數據輸入方法。這樣,數據輸入方法是可分離的。如果用戶意識到他忘記了某些東西,並且想要返回,我可以獨立地給他們打電話。這可能與您的設置也可能,但交互不是很清楚。毫無疑問,這主要是我習慣的問題。儘管如此,我發現儘可能使事情彼此獨立,簡化未來的變革。另外,我不知道GUI還有多少。如果你所展示的幾乎是所有的用戶交互,那麼我認爲你所擁有的將會很好地工作。

+0

非常感謝您的回覆。我仍然有一個問題。我稱之爲一種方法,然後在第一種方法結束時調用另一種方法,即「最佳」方法來做我想做的事情?例如,我調用「speed_widgets」,然後調用「get_speeds」,然後根據最後一個方法的輸入調用「bp_widgets」?當我在MATLAB中製作圖形用戶界面時,我記得我可以通過輸入由程序員定義的特定信息來激活先前停用的其他窗口小部件。我確實喜歡彈出窗口的想法,而grid_forget方法很有幫助。再次感謝你! – elmons13

+0

我編輯了我的答案,給你我的想法。這主要是個人意見。我已經習慣了似乎適合我的習慣,但其他人可能不喜歡我的控制流程的工作方式。如果你的圖形用戶界面能夠做到你想要的,並且它能夠正常工作,那麼我不會過分擔心它是否是「pythonic」。無論如何,這個詞似乎並不太重要。或者至少,這似乎意味着每個使用它的人都會有所不同。 – saulspatz