یکی از قابلیتهای مهم tkinter استفاده از پنجره های باز کردن و ذخیره کردن فایلها است و می خواهیم با یک مثال نحوه کار با  آنها را توضیح دهیم.

برنامه ای که می نویسیم قرار است یک کارد text داشته باشد و با استفاده از یک دکمه بتوان یک فایل متنی را باز کرد و متن آن را در کادر نمایش داد. همچنین با یک دکمه دیگر متن نوشته شده داخل یک کادر را داخل یک فایل متنی ذخیره نمود.

شکل ظاهری این برنامه به این صورت خواهد بود:

فایل ها در tkinter

import tkinter as tk
from tkinter import *
from tkinter import filedialog
root = tk.Tk()
root.geometry('400x400')
root.resizable(False, False)
root.title('Files karakit')
def open_file():
   mypath = filedialog.askopenfilename (initialfile = 'Untitled.txt' , title="Open Text file",   defaultextension=".txt",filetypes=[("Text Documents","*.txt")])
   if not mypath:
        return
   myfile = open(mypath, 'r', encoding='utf8')
   textcontent = myfile.read()
   txt.insert(END,textcontent)
   root.title(mypath)
def save_file():
   mypath = filedialog.asksaveasfilename (initialfile = 'Untitled.txt' , title="Save Text file",initialdir="/",defaultextension=".txt",filetypes=[("Text Documents","*.txt")])
   if not mypath:
        return
   myfile =open(mypath, 'w', encoding='utf8')
   mytext=txt.get(1.0,END) 
   myfile.write(mytext)
   root.title(mypath)
txt = Text(root) 
txt.place(height=320,width=380,x=10,y=20)
btnOpen= Button(root, text= "Open", command= open_file)
btnOpen.place(height=30,width=40,x=130,y=355)
btnSave= Button(root, text= "Save", command= save_file)
btnSave.place(height=30,width=40,x=200,y=355)
root.mainloop()

توضیح برنامه

بعد از احضار کتابخانه و ایجاد پنجره اصلی ، دو تابع به نام open_file و save_file  تعریف شده است که عملکرد آنها بعدا توضیح داده می شود.

در خط 24 و 25 یک ویجت text ایجاد و جانمایی کرده ایم. در 4 خط بعدی 2 دکمه btnOpen و btnSave تعریف و جانمایی شده اند و

با کلیک روی آنها به ترتیب تابع های open_file و save_file فراخوانی اجرا می شوند.

تابع open_file

در خط 9 با استفاده از filedialog.askopenfilename  یک پنجره باز می شود که کاربر می تواند در آن مسیر فایل مورد نظر و سپس فایل دلخواه را انتخاب و باز کند. مسیر و نام فایل در متغیر محلی mypath که خودمان تعیین کرده ایم ذخیره می شود.

فایل ها در tkinter

هنگام استفاده از این دستور پارامترهای زیادی را می توان تنظیم کرد.

ابتدا با استفاده از

initialfile = ‘Untitled.txt’

نام پیش فرض فایل را که در پنجره بالا در قسمت file name نشان داده می شود تعیین می کنیم که در اینجا Untitles.txt است. سپس با استفاده از پارامتر title مشخص کرده ایم که عنوان نمایش داده شده در بالای پنجره Open Text File باشد.

بعد از عنوان به این صورت کاری می کنیم که پسوند پیش فرض .txt باشد:

defaultextension=”.txt”

حالا به این صورت کاری می کنیم که فقط فایلهای با پسوند .txt نمایش داده شوند:

filetypes=[(“Text Documents”,”*.txt”)]

اما در قسمت مربوط به فرمت فایل عنوان Text Documents نمایش داده شود.

اگر کاربر به جای دکمه open روی دکمه cancel کلیک کند متغیر mypath مقداری نمی گیرد. بنابراین برای جلوگیری از رخ دادن خطا در خط 10 و 11 به برنامه می گوییم که اگر این متغیر مقداری نداشت از تابع خارج شود.

در خط 12 با استفاده از دستور open فایلی را که آدرس آن در mypath ذخیره شده باز می کنیم و در myfile قرار می دهیم. چون قصد داریم که فایل در حالت خواندنی باز شود از ‘r’ استفاده کرده ایم. یک پارامتر اختیاری را نیز در انتها تعیین می کنیم تا متن فارسی نیز قابل نمایش باشد:

encoding=’utf8′

سپس با استفاده از .read() محتوای فایل myfile را در متغیر txtcontect می ریزیم و در خط بعد این محتوا را با استفاده از insert در کادر متن ویجت txt نمایش می دهیم.

فایل ها در tkinter

تابع save_file

در تابع دوم که همان save_file است مجددا مسیر را باید در یک متغیر محلی ذخیره کنیم. با این تفاوت که این بار از این دستور استفاده می کنیم که در نتیجه پنجره ذخیره فایل باز می شود. پارامترهایی که تنظیم کردیم مشابه حالت قبل است. اما این بار یک پارامتر دیگر استفاده کرده ایم تا پنجره موقع باز شدن در یک مسیر از پیش تعیین شده قرار بگیرد.

مثلا با این دستور با فشردن دکمه save همیشه درایو سیستمی در ویندوز نمایش داده می شود:

initialdir=”/”

اگر کاربر به جای دکمه save روی دکمه cancel کلیک کند متغیر mypath مقداری نمی گیرد. بنابراین برای جلوگیری از رخ دادن خطا در خط 18  و 19 به برنامه می گوییم که اگر این متغیر مقداری نداشت از تابع خارج شود.

این بار در خط 20 فایل را با استفاده از ‘w’ در حالت نوشتن باز می کنیم. سپس در خط بعد محتوای متن داخل کادر ویجت txt را در متغیر mytext ذخیره می کنیم.

حالا به این صورت محتوای متنی ذخیره شده را در فایل می نویسیم:

myfile.write(mytext)

و باز هم در خط بعد عنوان پنجره اصلی را برابر با مسیر و نام فایل قرار می دهیم.

فایل ها در tkinter
فایل ها در tkinter

آموزشهای ابزار طراحی GUI در پایتون: tkinter