2017-01-24 160 views
0

我試圖將不同的單選按鈕鏈接到不同的文件夾。我設法打開一個文件夾,但現在所有的單選按鈕都鏈接到該文件夾​​。我明白,這是因爲他們有相同的使用第一個單選按鈕路徑的稱號,但我不知道如何改變它。我的問題是,如何將不同的單選按鈕鏈接到不同的文件夾? 另外,如何在同一時間從1個文件夾打開多個文件? 這裏是我的代碼:如何將不同的單選按鈕鏈接到不同的文件夾

from tkinter import* 
from tkinter import filedialog 
import tkinter.constants 

class filedialogexample(tkinter.Frame): 
    def __init__(self, root): 
     tkinter.Frame.__init__(self, root) 
     self.favorite = StringVar() 

     tkinter.Radiobutton(self, text = "Browse 1", variable = self.favorite, 
       command = self.askopenfilename 
       ).grid(row=2, column =0, columnspan = 2, sticky =W) 
     tkinter.Radiobutton(self, text = "Browse 2", variable = self.favorite, 
       command = self.askopenfilename 
       ).grid(row=3, column =0, columnspan = 2, sticky =W) 
     tkinter.Radiobutton(self, text = "Browse 3", variable = self.favorite, 
       command = self.askopenfilename 
       ).grid(row=4, column =0, columnspan = 2, sticky =W) 
     tkinter.Radiobutton(self, text = "Browse 4", variable = self.favorite, 
       command = self.askopenfilename 
       ).grid(row=5, column =0, columnspan = 2, sticky =W) 


     self.dir_opt = options = {} 
     options['initialdir'] = 'C:\\Users\\kom01\\Documents\\Python Scripts' 


    def askopenfilename(self): 
     filename = filedialog.askopenfilename(**self.dir_opt) 
     if filename: 
      return open(filename, 'r') 

    def askdirectory(self, root): 
     return filedialog.askdirectory(**self.dir_opt) 

if __name__=='__main__': 
    root = Tk() 
    filedialogexample(root).grid() 
    root.mainloop() 

在此先感謝您的幫助!

+0

您是否希望傳遞給'filedialog.askopenfilename'的'initialdir'對每個單選按鈕不同?無論如何,你應該給每個單選按鈕一個值,這樣變量'self.favorite'將包含對應於所選單選按鈕的值。另外,你的'askopenfilename'函數返回的文件不能在按鈕命令中使用。 –

+0

感謝您的快速響應。是的,每個單選按鈕都有自己的'initialdir'。感謝提供有價值的提示,忘了那個。最後,我在某處找到了用'askopenfilename'返回文件的代碼,但它不起作用。我應該用什麼來代替? – Cucumber12

+0

這取決於你想要對文件做什麼,你可以在函數內部完成它,或者你可以創建一個屬性來存儲文件名'self.myfile = filename'並將它用在其他函數中。 –

回答

1

要根據選擇哪個單選按鈕來傳遞不同的initialdirfiledailog.askopenfilename,可以使用單選按鈕的值選項。由於您所有的單選按鈕都連接到self.favorite變量,因此self.favorite將包含所選單選按鈕的值。

首先,您需要爲每個單選按鈕分配一個文件夾的路徑(在創建單選按鈕時爲value='path\\to\\folder')。然後,在askopenfilename中,您將通過self.favorite.get()作爲initialdir。最後,返回打開的文件是無用的,因爲你無法從按鈕命令中獲取它。所以你應該直接對askopenfilename函數裏的文件執行操作。在下面的例子中,我只是打印文件的內容。

import tkinter 
from tkinter import filedialog 

class filedialogexample(tkinter.Frame): 
    def __init__(self, root): 
     tkinter.Frame.__init__(self, root) 
     self.favorite = tkinter.StringVar() 

     tkinter.Radiobutton(self, text = "Browse 1", variable = self.favorite, 
       command=self.askopenfilename, value="folder1" 
       ).grid(row=2, column=0, columnspan=2, sticky='w') 
     tkinter.Radiobutton(self, text = "Browse 2", variable = self.favorite, 
       command=self.askopenfilename, value="folder2" 
       ).grid(row=3, column=0, columnspan=2, sticky='w') 
     tkinter.Radiobutton(self, text = "Browse 3", variable = self.favorite, 
       command=self.askopenfilename, value="folder3" 
       ).grid(row=4, column=0, columnspan=2, sticky='w') 
     tkinter.Radiobutton(self, text = "Browse 4", variable = self.favorite, 
       command=self.askopenfilename, value="folder4" 
       ).grid(row=5, column=0, columnspan=2, sticky='w') 
     # replace folder1,..,folder4 by actual paths to folders 


    def askopenfilename(self): 
     # initialdir is given by the selected radiobutton 
     filename = filedialog.askopenfilename(initialdir=self.favorite.get()) 
     if filename: 
      self.do_something_on_selected_file(filename) 

    def do_something_on_selected_file(self, filename): 
     with open(filename, 'r') as myfile: 
      print(myfile.read()) 

if __name__=='__main__': 
    root = tkinter.Tk() 
    filedialogexample(root).grid() 
    root.mainloop() 
相關問題