2015-01-09 74 views
0

我正在用Tkinter編寫一個Python 3程序,它在Windows 8.1下運行。Python中的全局變量和文件名

我需要選擇兩個文件夾,它們將在另一個功能中一起使用。目前,我有兩個選擇文件按鈕,它們打開選擇文件夾對話框:

def select_file_1(self): 
    global first_file 
    first_file = filedialog.askdirectory() 

def select_file_2(self): 
    global second_file 
    second_file = filedialog.askdirectory() 

這些正常工作:每當被點擊的按鈕,它出現並詢問一個目錄。

然後,只有一次使用first_file和second_file變量,在使用它們之前我也會注意到它們是全局變量。這是選擇了其他按鈕時:嘗試與f1 = open閱讀上面開始線的時候NameError: name 'first_file' is not defined

def create_composite(self): 
    global first_file 
    global second_file 

    f1 = open(first_file, "r") 
    f2 = open(second_file, "r") 

然而,這會導致下面的錯誤。

如果它有助於清晰起見,下面的屏幕截圖中是我的界面的相關部分。通過單擊第一個選擇文件調用select_file_1,並通過單擊第二個選擇文件調用select_file_2。然後,通過單擊創建類來調用create_composite。

screnshot for clarity

+3

我不知道是什麼原因導致你的問題,但爲什麼不讓他們的'self'的屬性呢?像'self.first_file'和'self.second_file'。 (或者甚至可能只是'self.files') – Kevin 2015-01-09 20:24:56

+1

在python中進行10多年的編程,我還沒有使用'global'關鍵字。如果你使用它,你很可能應該重構你的代碼。 – Gerrat 2015-01-09 20:26:01

+0

@Gerrat,偶爾我將單例類重構成模塊,然後成員變量變成模塊全局變量 - 並且方法變成使用'global'的函數。:)不知道它是一個好的模式,但是...或者是單例。 – 2015-01-09 20:30:24

回答

0

您正確投遞工作的片段,只要select_file_1()select_file_2()create_composite之前被稱爲

如果您仍然遇到問題,您需要創建一個完整,小巧的代碼工作位,以便其他人可以看到問題。

噢,filedialog.askdirectory返回一個目錄的名稱,而不是一個文件 - 試圖打開這不是一個好主意。