会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133327个问题
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1546楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1547楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1548楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1549楼

"""开发记事本软件菜单"""


from tkinter.filedialog import *
from tkinter.colorchooser import *

class Application(Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.textpad=None
        self.pack()
        self.createWidget()
    def createWidget(self):
        #创建主菜单栏
        menubar=Menu(root)

        #print(menubar)
        #创建子菜单
        menuFile=Menu(menubar)
        menuEdit=Menu(menubar)
        menuHelp=Menu(menubar)
        #将子菜单栏添加到主菜单栏
        menubar.add_cascade(label="文件(F)",menu=menuFile)
        menubar.add_cascade(label="编辑(E)",menu=menuEdit)
        menubar.add_cascade(label="帮助(H)",menu=menuHelp)
        #给子菜单栏添加菜单项目
        menuFile.add_command(label="新建",accelerator="<Ctrl-n>",command=self.newfile)
        menuFile.add_command(label="打开",accelerator="<Ctrl-o>",command=self.openfile)
        menuFile.add_command(label="保存",accelerator="<Ctrl-s>",command=self.savefile)
        menuFile.add_separator()#添加分割线
        menuFile.add_command(label="退出",accelerator="<Ctrl-q>",command=self.exit)

        #将主菜单栏添加到根窗口
        #root.config(menu=menubar)
        root["menu"]= menubar


        #添加文本框
        self.textpad=Text(root)
        self.textpad.pack()

        #创建上下菜单
        self.contextMenu=Menu(root)
        self.contextMenu.add_command(label="背景颜色",command=self.openAskColor)
        #鼠标右键绑定事件
        root.bind("<Button-3>",self.createContextMenu)#通过鼠标右键单击组件而弹出的菜单,需要通过调用post显示鼠标的坐标来显示位置,还有定义方法显示

    def newfile(self):
        self.textpad.delete("1.0","end")
        self.filename=asksaveasfile(title="另存为",initialfile="未命名.txt",filetypes=[("文本文档","*.txt")],
                                    defaultextension=".txt")

        self.savefile()

    def openfile(self):
        self.textpad.delete("1.0","end")#把text控件中的所有内容情空
        with askopenfile(title="打开文本文件") as f:
            self.textpad.insert(INSERT,f.read())
            self.filename=f.name



    def savefile(self):
        with open(self.filename,"w") as f:
            c=self.textpad.get(1.0,END)#获取textpad内的所有内容,
            f.write(c)#写到打开的文件中

    def exit(self):
        root.quit()

    def openAskColor(self):
        s1=askcolor(color="red",title="选择背景色")
        self.textpad.config(bg=s1[1])
    def createContextMenu(self,event):
        #菜单在鼠标右键单击的坐标处显示
        self.contextMenu.post(event.x_root,event.y_root)




if __name__ == '__main__':
    root=Tk()
    root.geometry("400x300+200+300")
    root.title("百战程序员简单的记事本")
    app=Application(master=root)
    root.mainloop()

点击newfile保存后报错是这个,不知道哪里出问题

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Test/Desktop/study/my26.py", line 54, in newfile
    self.savefile()
  File "C:/Users/Test/Desktop/study/my26.py", line 65, in savefile
    with open(self.filename,"w") as f:
TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1550楼

老师,为什么我找着视频中的源码敲了一遍然后,保存所写的文本时总是报错。。





"""开发记事本软件的菜单

"""

coding=utf-8


from tkinter.filedialog import *

from tkinter.colorchooser import *

from tkinter import *




class Application(Frame):


    def __init__(selfmaster=None):

        super().__init__(master)        # super()代表的是父类的定义,而不是父类对象

        self.master = master

        self.textpad = None             # textpad表示Text文本框对象

        self.pack()

        self.createWidget()


    def createWidget(self):

        # 创建主菜单栏

        menubar = Menu(root)


        # 创建子菜单

        menuFile = Menu(menubar)

        menuEdit = Menu(menubar)

        menuHelp = Menu(menubar)


        # 将子菜单加入到主菜单栏

        menubar.add_cascade(label="文件(F)"menu=menuFile)

        menubar.add_cascade(label="编辑(E)"menu=menuEdit)

        menubar.add_cascade(label="帮助(H)"menu=menuHelp)


        # 添加菜单项

        menuFile.add_command(label="新建"accelerator="ctrl+n"command=self.newfile)

        menuFile.add_command(label="打开"accelerator="ctrl+o"command=self.openfile)

        menuFile.add_command(label="保存"accelerator="ctrl+s",command=self.savefile)

        menuFile.add_separator()  # 添加分割线

        menuFile.add_command(label="退出"accelerator="ctrl+q",command=self.exit)


        # 将主菜单栏加到根窗口

        root["menu"] = menubar


        # 增加快捷键的处理

        root.bind("<Control-n>",lambda event:self.newfile())

        root.bind("<Control-o>",lambda event:self.openfile())

        root.bind("<Control-s>",lambda event:self.savefile())

        root.bind("<Control-q>",lambda event:self.exit())


        #文本编辑区

        self.textpad = Text(root, width=50, height=30)

        self.textpad.pack()


        # 创建上下菜单

        self.contextMenu = Menu(root)

        self.contextMenu.add_command(label="背景颜色"command=self.openAskColor)


        #为右键绑定事件

        root.bind("<Button-3>",self.createContextMenu)


    def newfile(self):

        self.textpad.delete("1.0""end")  # 把text控件中所有的内容清空

        self.filename= asksaveasfilename(title="另存为",initialfile="未命名.txt",

                          filetypes=[("文本文档","*.txt")],

                          defaultextension=".txt")

        self.savefile()


    def openfile(self):

        self.textpad.delete("1.0","end")        # 把text控件中所有的内容清空

        with askopenfile(title="打开文本文件"as f:

            self.textpad.insert(INSERT,f.read())

            self.filename = f.name


    def savefile(self):

        with open(self.filename,"w"as f:

            c = self.textpad.get(1.0,END)

            f.write(c)


    def exit(self):

        root.quit()


    def openAskColor(self):

        s1 = askcolor(color="red",title="选择背景色")

        self.textpad.config(bg=s1[1])

    def createContextMenu(self,event):

        # 菜单在鼠标右键单击的坐标处显示

        self.contextMenu.post(event.x_root, event.y_root)



if __name__ == '__main__':

    root = Tk()

    root.geometry("450x300+200+300")

    root.title("百战程序员的简易记事本")

    app = Application(master=root)

    root.mainloop()

截图如下:

屏幕截图 2021-04-11 173723.png

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1551楼

老师你好,我跟着高老师的源码敲了一遍,然后保存文件的时候总是报错,是怎么回事

"""开发记事本软件的菜单
"""
coding=utf-8

from tkinter.filedialog import *
from tkinter.colorchooser import *
from tkinter import *



class Application(Frame):

    def __init__(self, master=None):
        super().__init__(master)        # super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.textpad = None             # textpad表示Text文本框对象
        self.pack()
        self.createWidget()

    def createWidget(self):
        # 创建主菜单栏
        menubar = Menu(root)

        # 创建子菜单
        menuFile = Menu(menubar)
        menuEdit = Menu(menubar)
        menuHelp = Menu(menubar)

        # 将子菜单加入到主菜单栏
        menubar.add_cascade(label="文件(F)", menu=menuFile)
        menubar.add_cascade(label="编辑(E)", menu=menuEdit)
        menubar.add_cascade(label="帮助(H)", menu=menuHelp)

        # 添加菜单项
        menuFile.add_command(label="新建", accelerator="ctrl+n", command=self.newfile)
        menuFile.add_command(label="打开", accelerator="ctrl+o", command=self.openfile)
        menuFile.add_command(label="保存", accelerator="ctrl+s",command=self.savefile)
        menuFile.add_separator()  # 添加分割线
        menuFile.add_command(label="退出", accelerator="ctrl+q",command=self.exit)

        # 将主菜单栏加到根窗口
        root["menu"] = menubar

        # 增加快捷键的处理
        root.bind("<Control-n>",lambda event:self.newfile())
        root.bind("<Control-o>",lambda event:self.openfile())
        root.bind("<Control-s>",lambda event:self.savefile())
        root.bind("<Control-q>",lambda event:self.exit())

        #文本编辑区
        self.textpad = Text(root, width=50, height=30)
        self.textpad.pack()

        # 创建上下菜单
        self.contextMenu = Menu(root)
        self.contextMenu.add_command(label="背景颜色", command=self.openAskColor)

        #为右键绑定事件
        root.bind("<Button-3>",self.createContextMenu)

    def newfile(self):
        self.textpad.delete("1.0", "end")  # 把text控件中所有的内容清空
        self.filename= asksaveasfilename(title="另存为",initialfile="未命名.txt",
                          filetypes=[("文本文档","*.txt")],
                          defaultextension=".txt")
        self.savefile()

    def openfile(self):
        self.textpad.delete("1.0","end")        # 把text控件中所有的内容清空
        with askopenfile(title="打开文本文件") as f:
            self.textpad.insert(INSERT,f.read())
            self.filename = f.name

    def savefile(self):
        with open(self.filename,"w") as f:
            c = self.textpad.get(1.0,END)
            f.write(c)

    def exit(self):
        root.quit()

    def openAskColor(self):
        s1 = askcolor(color="red",title="选择背景色")
        self.textpad.config(bg=s1[1])
    def createContextMenu(self,event):
        # 菜单在鼠标右键单击的坐标处显示
        self.contextMenu.post(event.x_root, event.y_root)


if __name__ == '__main__':
    root = Tk()
    root.geometry("450x300+200+300")
    root.title("百战程序员的简易记事本")
    app = Application(master=root)
    root.mainloop()

报错截图:

在面板上打字然后保存就会报错

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1552楼

老师您好,请问一下

#coding=utf-8
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *

#构造方法

class Application(Frame):

    def __init__(self, master):
        super().__init__(master)
       

        self.create_widget()


    def create_widget(self):
        # 设置主菜单
        menu_import = Menu(root)

        # 设置子菜单
        self.menu_file = Menu(menu_import)
        menu_edit = Menu(menu_import)
        menu_help = Menu(menu_import)
        menu_import.add_cascade(label="文件(F)", menu=self.menu_file)
        menu_import.add_cascade(label="编辑(E)", menu=menu_edit)
        menu_import.add_cascade(label="帮助(H)", menu=menu_help)

        # 设置可用功能
        self.menu_file.add_command(label="新建", accelerator="ctrl+n", command=self.method_new_file)
        self.menu_file.add_command(label="打开", accelerator="ctrl+t", command=self.method_open_file)
        self.menu_file.add_command(label="保存", accelerator="ctrl+r", command=self.save_file)
        self.menu_file.add_separator()       # 添加分割线
        self.menu_file.add_command(label="退出", accelerator="ctrl+o", command=self.method_quit)


        # 创建上下菜单
        self.contexMenu = Menu(root)
        self.contexMenu.add_command(label="背景颜色", command=self.method_colo)

        # 设置文本框
        self.textpad = Text(root, width=40, height=30, bg="gray")
        self.textpad.pack()

        # 添加快捷方式
        root.bind("<Control-n>", lambda event: self.method_new_file())
        root.bind("<Control-t>", lambda event: self.method_open_file())
        root.bind("<Control-r>", lambda event: self.save_file())
        root.bind("<Control-o>", lambda event: self.method_quit())
        root.bind("<Button-3>", lambda event: self.method_colo())


        # 将主菜单放入根窗口
        root["menu"] = menu_import


        # 建设可用功能的方法

    def method_new_file(self):


        self.file_name = asksaveasfilename(title="另存为", initialfile="未命名.txt",
                                        filetypes =[("文本文档", "*.txt")], defaultextension=".txt")
        print(self.file_name)
        self.save_file()

    def method_open_file(self):
        self.textpad.delete("1.0", "end")
        with askopenfile(title="打开文件")as f:
            self.textpad.insert(INSERT, f.read())
            self.file_name = f.name
            print(f.name)

    def save_file(self):
        with open(self.file_name, "w", encoding="utf_8")as f:
            c = self.textpad.get(1.0, END)
            f.write(c)

    def method_quit(self):
        root.quit()

    def method_colo(self):
        colo_1 = askcolor(title="请选择颜色", color="gray")
        self.textpad.config(bg=colo_1[1])
if __name__ == "__main__":
    root = Tk()
    root.geometry("400x400+500+200")
    root.title("记事本的应用")
    app = Application(master=root)
    root.mainloop()

1,这里所说的创建上下菜单感觉可有可无啊,都可以正常运行而且运行过程和结果看起来都一样,那么还有写这个的必要吗?

2,self是调用类里面的类属性,可是就按我这个写的话似乎也没有影响,那么在__int__中写self的作业是什么?为了以后查看方便吗?

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1554楼

老师您好,我这个打开老是乱码怎么办?

#coding=utf-8
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *

#构造方法

class Application(Frame):

    def __init__(self, master):
        super().__init__(master)
        self.master = master
        self.pack()
        self.file_name = None
        self.textpad = None
        self.create_widget()


    def create_widget(self):
        # 设置主菜单
        menu_import = Menu(root)

        # 设置子菜单
        menu_file = Menu(menu_import)
        menu_edit = Menu(menu_import)
        menu_help = Menu(menu_import)
        menu_import.add_cascade(label="文件(F)", menu=menu_file)
        menu_import.add_cascade(label="编辑(E)", menu=menu_edit)
        menu_import.add_cascade(label="帮助(H)", menu=menu_help)

        # 设置可用功能
        menu_file.add_command(label="新建", accelerator="ctrl+n", command=self.method_new_file)
        menu_file.add_command(label="打开", accelerator="ctrl+t", command=self.method_open_file)
        menu_file.add_command(label="保存", accelerator="ctrl+r", command=self.save_file)
        menu_file.add_command(label="退出", accelerator="ctrl+o", command=self.method_quit)
        # 设置文本框
        self.textpad = Text(root, width=40, height=30, bg="gray")
        self.textpad.pack()
        root.bind("<Control-n>", lambda event: self.method_new_file())
        root.bind("<Control-t>", lambda event: self.method_open_file())
        root.bind("<Control-r>", lambda event: self.save_file())
        root.bind("<Control-o>", lambda event: self.method_quit())
        root["menu"] = menu_import

        # 建设可用功能的方法

    def method_new_file(self):


        self.file_name = asksaveasfilename(title="另存为", initialfile="未命名.txt",
                                        filetypes =[("文本文档", "*.txt")], defaultextension=".txt")
        print(self.file_name)
        self.save_file()

    def method_open_file(self):
        self.textpad.delete("1.0", "end")
        with askopenfile(title="打开文件")as f:
            self.textpad.insert(INSERT, f.read())
            self.file_name = f.name
            print(f.name)

    def save_file(self):
        with open(self.file_name, "w", encoding="utf_8")as f:
            c = self.textpad.get(1.0, END)
            f.write(c)

    def method_quit(self):
        root.quit()

if __name__ == "__main__":
    root = Tk()
    root.geometry("400x400+500+200")
    root.title("记事本的应用")
    app = Application(master=root)
    root.mainloop()

blob.png

blob.png

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1555楼
Python 全系列/第二阶段:Python 深入与提高/文件处理 1556楼
Python 全系列/第二阶段:Python 深入与提高/文件处理 1557楼

module_q.png

老师,为什么第三四行代码报错了?

我看到有别人也问这个,那个链接点进去看了还是没解决问题

Python 全系列/第二阶段:Python 深入与提高/模块 1559楼
Python 全系列/第二阶段:Python 深入与提高/文件处理 1560楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637