如何解决.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 举报,一经查实,本站将立刻删除。