我想用Python Tkinter做一个记事本编辑器,它有一个菜单,我可以在其中编辑字体(字体的大小和样式)。
无论尝试什么,我都会不断出错。虽然我是Python的新手,所以可能是我犯了一个明显的错误。我希望有人能提供帮助。
当我单击“ Opmaak”(即布局),然后单击“ Lettergrootte”(即字体大小)时,我想弹出一个选项菜单,可以在其中更改字体大小和样式-但我得到了出现以下错误:
with open(local_filename, 'wb') as f:
r = requests.get(url_with_filename, stream=True) # added stream parameter
# total_size = int(r.headers.get('content-length', 0))
local_filename = DATA_PATH + '/' + filename
total_size = len(r.content)
downloaded = 0
# chunk_size = max(1024*1024,int(total_size/1000))
chunk_size = 1024
#for chunk in tqdm(r.iter_content(chunk_size=chunk_size),total=total_size,unit='KB',unit_scale=True):
for chunk in r.iter_content(chunk_size=chunk_size):
downloaded += len(chunk)
a=f.write(chunk)
done = int(50 * downloaded/ total_size)
sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50 - done)))
sys.stdout.flush()
这是我的代码:
> Exception in Tkinter callback
Traceback (most recent call last):
File "AppData\Local\Mu\pkgs\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
TypeError: __opmaak() missing 1 required positional argument: 'nieuweFont'
在修复我的代码方面的任何帮助将不胜感激。预先谢谢你!
答案 0 :(得分:1)
您应该提供最少的代码,而不是整个项目!
您的错误是您传递了一个参数,但预期传递两个参数。
可能的解决方案:
from tkinter import *
class Kladblok:
def __init__(self, master):
self.font1 = font=("Open Sans Standard",16,"bold")
self.font2 = font=("Times",12,"bold")
self.master = master
self.__thisTekstVlak = Text(self.master, font=self.font1)
self.__thisMenuBar = Menu(self.master)
self.__thisOpmaakMenu = Menu(self.__thisMenuBar, tearoff=0)
self.__thisScrollBar = Scrollbar(self.__thisTekstVlak)
self.master.title("Naamloos - Kladblok")
self.master.geometry(("300x300"))
self.master.grid_rowconfigure(0, weight=1)
self.master.grid_columnconfigure(0, weight=1)
self.__thisTekstVlak.grid(sticky = N + E + S + W)
self.__thisOpmaakMenu.add_command(label="Lettergrootte", command=lambda: self.__opmaak(self.font2))
self.__thisMenuBar.add_cascade(label="Opmaak", menu=self.__thisOpmaakMenu)
self.master.config(menu=self.__thisMenuBar)
self.__thisScrollBar.pack(side=RIGHT,fill=Y)
# Scrollbar will adjust automatically according to the content
self.__thisScrollBar.config(command=self.__thisTekstVlak.yview)
self.__thisTekstVlak.config(yscrollcommand=self.__thisScrollBar.set)
def __opmaak(self, nieuweFont):
self.__thisTekstVlak.configure(font=nieuweFont)
if __name__ == "__main__":
root = Tk()
kladblok = Kladblok(root)
root.mainloop()
答案 1 :(得分:0)
正如@fhdrsdg所指出的那样,您的对象__opmaak定义为
def __opmaak(self,nieuweFont)
期望您传递两个参数:self(默认情况下传递)和nieuweFont。但是您要实现的小部件命令样式没有足够的空间。
self.__thisOpmaakMenu.add_command(label="Lettergrootte", command=self.__opmaak)
默认情况下,这会传递self参数,但不会为传递第二个参数留出空间,因此会出现错误:
TypeError: __opmaak() missing 1 required positional argument: 'nieuweFont'
如果打算将参数传递给tkinter小部件,则应使用lambda函数。 您的代码应更像:
self.__thisOpmaakMenu.add_command(label="Lettergrootte", command=lambda: self.__opmaak(nieuweFont))
默认情况下,这会传递self参数,并且还给您传递第二个必需参数nieuweFont的空间