.delete 在 tkinter 的课堂上不起作用

如何解决.delete 在 tkinter 的课堂上不起作用

我正在尝试使用类制作 tkinter 桌面应用程序(记事本),但我在我的代码中发现了一个属性错误。我制作了三个文件“menu_option.py”、“textarea.py”和“window_frame.py”。运行“menu_option.py”文件,以便找到错误。我正在使用 python (3.9)。还有其他方法可以将“new_file”函数连接到菜单项。 这是我的代码如下:

menu_option.py

from tkinter import *
from textarea import TextArea
from window_frame import Window


class Menu_Option(TextArea):
    file = None

    def __init__(self,master,newfile=None):
        super().__init__(root)
        self.Menubar = 'MenuBar'
        self.Filemenu = 'FileMenu'
        self.root = self.root
        self.master = self.master
        self.newfile = newfile

    def launch(self):
        self.Menubar = Menu(self.root)
        
        self.Filemenu = Menu(master=self.Menubar,tearoff=0)
        self.Filemenu.add_command(label='New File...',command=self.newfile)
        self.Menubar.add_cascade(label='File',menu=self.Filemenu)
        
        self.root.config(menu=self.Menubar)


class Features(Menu_Option):
    def __init__(self,master):
        super().__init__(master,newfile=self.new_file)

    def new_file(self):
        global file
        self.root.title(self.title)
        file = None
        self.textarea.delete(1.0,END)


if __name__ == '__main__':
    root = Tk()
    Window(root).launch()
    TextArea(root).launch()
    Menu_Option(root).launch()
    Features(root).launch()
    root.mainloop()

textarea.py

from tkinter import *
from window_frame import Window
from tkinter.scrolledtext import ScrolledText


class TextArea(Window):
    def __init__(self,name):
        super().__init__(name)
        self.name = self.root
        self.master = 'root'
        self.textarea = 'text_area'
        self.font = 'courier 14 normal'

    def launch(self):
        self.textarea = ScrolledText(self.root,font=self.font)
        self.textarea.pack(expand=True,fill=BOTH)


if __name__ == '__main__':
    root = Tk()
    Window(root).launch()
    TextArea(root).launch()
    root.mainloop()

window_frame.py

from tkinter import *

class Window:

    def __init__(self,root):
        self.root = root
        self.geometry = '1000x550+100+100'
        self.title = 'Untitled - ProBook'

    def launch(self):
        self.root.geometry(self.geometry)
        self.root.title(self.title)


if __name__ == '__main__':
    root = Tk()
    Window(root).launch()
    root.mainloop()

错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Installed Programs\Python\lib\tkinter\__init__.py",line 1892,in __call__
    return self.func(*args)
  File "C:\Users\vaish\OneDrive\ProBook\menu_option.py",line 35,in new_file
    self.textarea.delete(1.0,END)
AttributeError: 'str' object has no attribute 'delete'

解决方法

您已在 textarea.py 中初始化 self.textarea="text_area" 。但是当你在 menu_option.py 中导入它时,你正在覆盖函数启动,它应该将 self.textarea 的值设置为一个 ScrolledText 并打包它。要解决这个问题,您必须在 Menu_Option 类的函数启动中包含 textarea.py 的启动函数中的代码。

from tkinter import *
from tkinter.scrolledtext import ScrolledText
from textarea import TextArea
from window_frame import Window


class Menu_Option(TextArea):
    file = None

    def __init__(self,master,newfile=None):
        super().__init__(root)
        self.Menubar = 'MenuBar'
        self.Filemenu = 'FileMenu'
        self.root = self.root
        self.master = self.master
        self.newfile = newfile

    def launch(self):
        self.Menubar = Menu(self.root)

        #You have to include these 2 lines of code which were overwritten
        self.textarea = ScrolledText(self.root,font=self.font)
        self.textarea.pack(expand=True,fill=BOTH)

        self.Filemenu = Menu(master=self.Menubar,tearoff=0)
        self.Filemenu.add_command(label='New File...',command=self.newfile)
        self.Menubar.add_cascade(label='File',menu=self.Filemenu)
    
        self.root.config(menu=self.Menubar)
,

由于 Menu_Option() 具有覆盖 launch() 函数,因此 TextArea.launch() 不会被执行,因此实例变量 textarea 仍然是一个字符串。

如果子类想要继承父类launch()的功能,需要在其launch()函数中调用父类launch()

textarea.py

class TextArea(Window):
    ...

    def launch(self):
        super().launch()  # call parent class launch()
        self.textarea = ScrolledText(self.root,fill=BOTH)

menu_option.py

class Menu_Option(TextArea):
    ...

    def launch(self):
        super().launch()  # execute parent class launch()
        ...

...

if __name__ == "__main__":
    root = Tk()
    #Window(root).launch()       # <- no need to execute
    #TextArea(root).launch()     # <- no need to execute
    #Menu_Option(root).launch()  # <- no need to execute
    Features(root).launch()
    root.mainloop()

请注意,Window(root).launch()TextArea(root).launch()Menu_Option(root).launch() 不是必需的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?