鱼C论坛

 找回密码
 立即注册
查看: 1905|回复: 2

[已解决]用Tkinter写了个记事本小程序,有点问题不知道怎么解决。。。

[复制链接]
发表于 2020-10-9 10:28:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
  1. from tkinter import *
  2. from tkinter import filedialog,messagebox
  3. from tkinter.ttk import Scrollbar,Checkbutton,Label,Button
  4. import os
  5. import sys
  6. class Notepad(Tk):
  7.     def __init__(self):
  8.         super().__init__()
  9.         self.file_name = None
  10.         self.set_windows()
  11.         self.creat_menu_bar()
  12.         self.create_body()
  13.     def set_windows(self):
  14.         self.title("notepad--")
  15.         max_width, max_hight = self.maxsize()
  16.         algin_center = "500x300+%d+%d" % ((max_hight-500)/2, (max_hight-300)/2)
  17.         self.geometry(algin_center)
  18.     def creat_menu_bar(self):
  19.         menu_bar = Menu(self)
  20.         file_menu = Menu(menu_bar,tearoff=0)
  21.         menu_bar.add_cascade(label='文件',menu = file_menu)
  22.         file_menu.add_command(label='打开(O)... ', accelerator='Ctrl+O', command=self.open_file)
  23.         file_menu.add_command(label='保存(S) ', accelerator='Ctrl+S', command=self.save_file)
  24.         file_menu.add_command(label='另存为...', accelerator='Shift+Ctrl+N', command=self.save_as)
  25.         file_menu.add_separator()
  26.         file_menu.add_command(label='Exit ', accelerator='Alt+F4', command=self.exit)
  27.         editor_menu = Menu(menu_bar, tearoff=0)
  28.         menu_bar.add_cascade(label='编辑', menu=editor_menu)
  29.         editor_menu.add_command(label='查找(F) ', accelerator='Ctrl+F', command=self.find_text_dialog)
  30.         self['menu'] = menu_bar
  31.     # 界面主图
  32.     def create_body(self):
  33.         # 文本编辑  warp表示如何换行(word表示按单词自动换行)
  34.         self.context_text = Text(self, wrap="word",undo=True)
  35.         # 热键绑定
  36.         self.context_text.bind("<Control-s>", self.save_file)
  37.         self.context_text.bind("<Control-f>", self.search_result)
  38.         self.context_text.pack(fill='both',expand="yes")
  39.         # 设置文本输入
  40.         self.context_text.tag_config("active_line",background="#EEEEE0")
  41.     # 写入文件
  42.     def open_file(self,event=None):
  43.         # 打开文件并进行设置
  44.         input_file = filedialog.askopenfilename(filetypes=[("所有文件","*.*"),("文本文档","*.txt")])
  45.         if input_file:
  46.             self.title("{}***Notepad".format(os.path.basename(input_file)))
  47.             self.file_name = input_file
  48.             self.context_text.delete(1.0,END)
  49.             with open(input_file,'r') as f:
  50.                 self.context_text.insert(1.0,f.read())
  51.     def write_to_file(self,file_name):
  52.         try:
  53.             content = self.context_text.get(1.0,END)
  54.             with open(file_name,'w') as f1:
  55.                 f1.write(content)
  56.             self.title("{}---Notepad".format(os.path.basename(file_name)))
  57.         except IOError:
  58.             messagebox.showerror("error",'fail save')
  59.     # 保存文件
  60.     def save_file(self,event=None):
  61.         if not self.file_name:
  62.             self.save_as()
  63.         else:
  64.             self.write_to_file(self.file_name)
  65.     # 新建
  66.     def new_file(self,event=None):
  67.         self.title("new--Notepad")
  68.         self.context_text.delete
  69.         self.file_name = None
  70.     # 另存为
  71.     def save_as(self,event=None):
  72.         input_file = filedialog.asksaveasfile(filetypes=[("所有文件", "*.*"), ("文本文档", "*.txt")])
  73.         if input_file:
  74.             self.file_name = input_file
  75.             self.write_to_file(self.file_name)
  76.     # 退出
  77.     def exit(self,event=None):
  78.         if messagebox.askokcancel("exit","sure?"):
  79.             self.destroy()
  80.         return "break"
  81.     def find_text_dialog(self):
  82.         search_dialog = Toplevel(self)
  83.         search_dialog.title('search...')
  84.         search_dialog.iconbitmap('./img/head.ico')
  85.         max_width, max_hight = self.maxsize()
  86.         algin_center = "300x60+%d+%d" % ((max_hight - 300) / 2, (max_hight - 60) / 2)
  87.         search_dialog.geometry(algin_center)
  88.         search_dialog.resizable(FALSE,FALSE)
  89.         Label(search_dialog,text='find all').grid(row=0,column=0,sticky='e')
  90.         search_text = Entry(search_dialog,width=25)
  91.         search_text.grid(row=0,column=1,padx=2,pady=2,sticky="we")
  92.         search_text.focus_set()
  93.         ignore_case_value = IntVar()
  94.         Checkbutton(search_dialog,text='忽略大小写',variable=ignore_case_value).grid(row=1,column=1,sticky='e',padx=2,pady=2)
  95.         Button(search_dialog,text="search",command=lambda :self.search_result(search_text.get(),ignore_case_value.get(),
  96.         search_dialog,search_text)).grid(row=1,column=2,sticky="w"+"e",padx=2,pady=2)

  97.         def close_search_dialog():
  98.             self.context_text.tag_remove('match',1.0,END)
  99.             search_dialog.destroy()
  100.         search_dialog.protocol("WM_DELETE_WINDOW",close_search_dialog)
  101.         return "break"

  102.     def search_result(self,key,ignore_case,search_dialog,search_box):
  103.         self.context_text.tag_remove('match',1.0,END)
  104.         match_found = 0
  105.         if key:
  106.             start_pos = 1.0
  107.             while True:
  108.                 start_pos = self.context_text.search(key,start_pos,nocase=ignore_case,stopindex=END)
  109.                 if not start_pos:
  110.                     break
  111.                 end_pos = "{}+{}c".format(start_pos,len(key))
  112.                 self.context_text.tag_add('match',start_pos,end_pos)
  113.                 match_found += 1
  114.                 start_pos= end_pos
  115.             self.context_text.tag_config('match',foreground='red',background='yellow')
  116.         search_box.focus_set()
  117.         search_dialog.title("发现%s个匹配" % match_found)
  118.     # def reolace_text(self):
  119. if __name__ == '__main__':
  120.     app = Notepad()
  121.     app.mainloop()
复制代码

在保存和另存为文件的时候会弹个错误,从来没见过,希望有大佬帮忙处理一下!!
TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper
最佳答案
2020-10-9 10:40:52
tkinter.filedialog.asksaveasfilename():选择以什么文件名保存,返回文件名
tkinter.filedialog.asksaveasfile():选择以什么文件保存,创建文件并返回文件流对象

干嘛要返回文件流对象?改一下
然后建议保存时直接添加后缀.txt
  1.     def save_as(self,event=None):
  2.         input_file = filedialog.asksaveasfilename(filetypes=[("所有文件", "*.*"), ("文本文档", "*.txt")])
  3.         print(input_file)
  4.         if input_file:
  5.             self.file_name = input_file+'.txt'
  6.             self.write_to_file(self.file_name)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-9 10:40:52 | 显示全部楼层    本楼为最佳答案   
tkinter.filedialog.asksaveasfilename():选择以什么文件名保存,返回文件名
tkinter.filedialog.asksaveasfile():选择以什么文件保存,创建文件并返回文件流对象

干嘛要返回文件流对象?改一下
然后建议保存时直接添加后缀.txt
  1.     def save_as(self,event=None):
  2.         input_file = filedialog.asksaveasfilename(filetypes=[("所有文件", "*.*"), ("文本文档", "*.txt")])
  3.         print(input_file)
  4.         if input_file:
  5.             self.file_name = input_file+'.txt'
  6.             self.write_to_file(self.file_name)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 10:53:28 | 显示全部楼层
疾风怪盗 发表于 2020-10-9 10:40
tkinter.filedialog.asksaveasfilename():选择以什么文件名保存,返回文件名
tkinter.filedialog.asksavea ...

原来是这样啊,懂了懂了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表