我目前正在一個類中使用Tkinter的GUI。我希望GUI根據以前的選擇向用戶詢問各種輸入。另外,我會注意到我對python比較陌生,絕對是Tkinter。不過,我之前已經在MATLAB中製作了GUI。Tkinter事件小部件
所以,我想要做的是以下幾點:
- 要求用戶提供速度來處理,用逗號分隔。然後用戶將輸入如下所示的速度:[90,100,102p5]。
- 要從條目中獲得輸入,您必須按Enter鍵,該鍵將調用函數以獲取速度字符串。然後我輸入輸入的字符串並根據逗號分隔它們以形成一個列表。
- 然後,一旦輸入速度,我想更新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()
tkinter的一個很棒的網站:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html – saulspatz
'self.speed_widgets()def speed_widgets(self):'是一行語法錯誤。請發佈工作代碼,或者至少需要編譯的代碼。 – saulspatz
謝謝你的鏈接!對於格式問題感到抱歉 - 當我將代碼從vi複製到本網站時必定發生。我確實修復了它。 – elmons13