2015-09-21 58 views
0

我正在編寫一個程序,該程序可以讀取和修改包含有關某些圖像信息的二進制文件:但爲了能夠做到這一點,還需要用戶提供一些信息,比方說這些圖像所在的文件夾以及幾個選項。如何使用TkInter創建輕型GUI

通過對網絡的快速研究,我發現創建圖形用戶界面的簡單方法是Tkinter,事實上我很快達到了我的目標。 特別是我使用了tkFileDialogtkMessageBox模塊,無需調用mainloop函數,每當我想在屏幕上顯示某些內容時創建並銷燬一個窗口:我不認爲這是正確的方法,但它完全適合我的應用程序,因爲通過這種方式,我能夠離開程序,因爲在與用戶「交談」的必要性之前,無需像「真實」GUI那樣用純粹反對的定向結構來重構程序。

時,我想提高這個接口,並使用按鈕插件給在三個選項中選擇的可能性的問題出現了:在這種情況下,mainloop似乎強制性..

因此,這裏的問題:它是否存在一種與用戶進行通信的策略,而無需將所有功能放入GUI類中,也不需要使用無限循環? (我認爲使用Tkinter的答案是否定的) 這種混合情況下最好的方法是什麼?

+1

運行無限 「事件循環」 基本上是應用程序如何GUI運行,一旦退出該應用程序關閉。所以不,你不能避免主循環,嘗試沒有意義。 – AcidReign

+0

看看這裏:http://stackoverflow.com/questions/7782425/tkinter-and-gui-programming-methods?rq=1 –

+0

@AcidReign:不一定。例如,在Windows上,您當然可以執行一些非UI工作,呈現窗口並運行消息循環,讓消息循環終止並執行更多非UI工作,然後顯示另一個窗口並運行另一個消息循環...在Windows ,通常通過嵌套的消息循環來實現模態對話框,所以它不像你所建議的那樣簡單。 – icktoofay

回答

1

我已經放在一起的骨架。幾個備註:

  1. 這是一個簡單的例子,只有三個函數需要1或2個參數。但是,適應更多的功能和論據應該是直截了當的。
  2. 我絕對不提倡在真正的程序中使用簡短的變量名稱。
  3. 考慮base.py利用班),如果它一旦適合你的邏輯二)GUI.py因爲它的增長一點點
  4. 使用grid可選參數有一個非常漂亮的圖形用戶界面。

總結上面的評論,目標是分離不同的部分:第一個模塊將包含所有的計算,但不會處理用戶輸入,第二個將使用命令行用戶輸入,並依靠第一個用於計算,第三個用於圖形界面,第一個用於計算。您還可以添加第四個測試。 當然,隨意,只要你知道爲什麼要修改這一模式。

評論歡迎。

第一模塊:

#file base.py 
def f1(input1): 
    ... 
    return res1 

def f2(res1, input2): 
    ... 
    return res2 

def f3(res2): 
    ... 
    return res3 

if __name__ == '__main__': 
    r1 = f1('directoryPath') 
    r2 = f2(r1, 'fileName') 
    r3 = f3(r2) 

第二個模塊:

#file commandline.py 
from base import * 

i1 = input() # in 3.X, raw_input in 2.X 
r1 = f1(i1) 

i2 = input() # in 3.X, raw_input in 2.X 
r2 = f2(r1, i2) 
r3 = f3(r2) 

第三模塊:

#file GUI.py 
from base import * 
import tkinter as tk # in 3.X, Tkinter in 2.X 

def compute(): 
    i1 = e1.get() 
    r1 = f1(i1) 

    i2 = e2.get() 
    r2 = f2(r1, i2) 
    r3 = f3(r2) 

    l1.configure(text = r3) #if r3 is a string else str(r3) 

app = tk.Tk() 
e1 = tk.Entry(app) 
e1.grid() 

e2 = tk.Entry(app) 
e2.grid() 

b1 = tk.Button(app, text = "Compute", command = compute) 
b1.grid() 

l1 = tk.Label(app) 
l1.grid() 

app.mainloop() 
+0

謝謝埃裏克你的回答!我想我錯過了一個關鍵點:第一個模塊如何啓動GUI(或命令行部分)?看起來第一個是「主要」的一個,但我不明白哪個是其他的邏輯,因爲它們不僅包含類別或功能,而且包含一些單個指令。無論如何謝謝你的時間和解釋! – giubacchio

+0

@giubacchio:第一個模塊無法啓動其他模塊。它可能包含幾乎所有的代碼,但您可以使用其中一個來啓動命令行版本或GUI版本。 您也可以將所有代碼放在一個模塊中,特別是如果您始終想要啓動GUI版本。 –

+0

我在尋找的是可以將主結構作爲您的第一個模塊,並且可以調用像GUI.py這樣的模塊,也可能不止一次,以便向用戶詢問一些信息。我不知道這是否可行,因爲通過這種方式將會發生多個主循環(但不是同時發生),並且這通常是不被允許的。 實現我的目標的一種方法是將所有主要計算放在GUI中調用的函數中(比方說使用開始按鈕),並詢問用戶何時需要某些信息。但我不太喜歡這個解決方案! – giubacchio