如何更改字体选项

时间:2018-10-12 07:03:43

标签: python tkinter fonts notepad

我想用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'

在修复我的代码方面的任何帮助将不胜感激。预先谢谢你!

2 个答案:

答案 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的空间