Как изменить параметры шрифта - PullRequest
0 голосов
/ 12 октября 2018

Я хочу создать своего рода редактор блокнота с Python Tkinter, у которого есть меню, в котором я могу редактировать шрифт (размер и стиль).

Я получаю ошибки, независимо от того, что япытаться.Я новичок в Python, хотя, возможно, я делаю очевидную ошибку.Я надеюсь, что кто-то может помочь.

Когда я нажимаю «Opmaak» (т.е. макет), а затем «Lettergrootte» (т.е. размер шрифта), я бы хотел всплывающее меню параметров, где я могу изменить размер шрифта.и стиль - но вместо этого я получаю следующую ошибку:

> 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'

Вот мой код:

import tkinter as tk 
import os  
from tkinter import * 
from tkinter.messagebox import *
from tkinter.filedialog import *

class Kladblok:
    __root = Tk()

    __thisBreedte = 300
    __thisHoogte = 300
    __thisTekstVlak = Text(__root) 
    __thisMenuBar = Menu(__root) 
    __thisBestandMenu = Menu(__thisMenuBar, tearoff=0) 
    __thisBewerkenMenu = Menu(__thisMenuBar, tearoff=0)
    __thisOpmaakMenu = Menu(__thisMenuBar, tearoff=0)
    __thisHelpMenu = Menu(__thisMenuBar, tearoff=0) 
    __thisScrollBar = Scrollbar(__thisTekstVlak)      
    __bestand = None

    def __init__(self,**kwargs): 

        try: 
            self.__root.wm_iconbitmap("Notepad.ico")  
        except: 
            pass

        try: 
            self.__thisBreedte = kwargs['breedte'] 
        except KeyError: 
            pass

        try: 
            self.__thisHoogte = kwargs['hoogte'] 
        except KeyError: 
            pass

        self.__root.title("Naamloos - Kladblok") 

        screenBreedte = self.__root.winfo_screenwidth() 
        screenHoogte = self.__root.winfo_screenheight() 

        links = (screenBreedte / 2) - (self.__thisBreedte / 2)  

        top = (screenHoogte / 2) - (self.__thisHoogte /2)  

        self.__root.geometry('%dx%d+%d+%d' % (self.__thisBreedte, self.__thisHoogte, links, top))  

        self.__root.grid_rowconfigure(0, weight=1) 
        self.__root.grid_columnconfigure(0, weight=1) 

        self.__thisTekstVlak.grid(sticky = N + E + S + W)

        self.__thisBestandMenu.add_command(label="Nieuw", command=self.__nieuwBestand) 

        self.__thisBestandMenu.add_command(label="Open", command=self.__openBestand) 

        self.__thisBestandMenu.add_command(label="Opslaan", command=self.__opslaanBestand)

        self.__thisBestandMenu.add_separator()                                          
        self.__thisBestandMenu.add_command(label="Exit", command=self.__exitBestand) 
        self.__thisMenuBar.add_cascade(label="Bestand", menu=self.__thisBestandMenu)

        self.__thisOpmaakMenu.add_command(label="Lettergrootte", command=self.__opmaak)

        self.__thisMenuBar.add_cascade(label="Opmaak", menu=self.__thisOpmaakMenu)

        self.__thisBewerkenMenu.add_command(label="Knippen", command=self.__knippen)              

        self.__thisBewerkenMenu.add_command(label="Kopieren", command=self.__kopieeren)          

        self.__thisBewerkenMenu.add_command(label="Plakken", command=self.__plakken)          

        self.__thisMenuBar.add_cascade(label="Bewerken", menu=self.__thisBewerkenMenu)    

        self.__thisHelpMenu.add_command(label="Over mij", command=self.__overMij)
        self.__thisMenuBar.add_cascade(label="Help mij", menu=self.__thisHelpMenu) 

        self.__root.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 __exitBestand(self): 
        self.__root.destroy()

    def __nieuwBestand(self): 
        self.__root.title("Naamloos - Kladblok") 
        self.__bestand = None
        self.__thisTekstVlak.delete(1.0,END) 

    def __openBestand(self): 

        self.__bestand = askopenfilename(defaultextension=".txt", filetypes=[("Alle bestanden","*.*"), ("Tekst bestanden","*.txt")]) 

        if self.__bestand == "": 
            self.__bestand = None

        else: 
            self.__root.title(os.path.basename(self.__bestand) + " - Kladblok") 
            self.__thisTekstVlak.delete(1.0,END) 

            bestand = open(self.__bestand,"r") 

            self.__thisTekstVlak.insert(1.0,bestand.read()) 

            bestand.close() 

    def __opslaanBestand(self):
        if self.__bestand == None: 
            self.__bestand = asksaveasfilename(initialfile='Naamloos.txt', defaultextension=".txt", filetypes=[("Alle bestanden","*.*"), ("Tekst bestanden","*.txt")]) 

            if self.__bestand == "": 
                self.__bestand = None

            else: 
                bestand = open(self.__bestand,"w") 
                bestand.write(self.__thisTekstVlak.get(1.0,END)) 
                bestand.close() 

                self.__root.title(os.path.basename(self.__bestand) + " - Kladblok") 

        else: 
            bestand = open(self.__bestand,"w") 
            bestand.write(self.__thisTekstVlak.get(1.0,END)) 
            bestand.close() 

    def __knippen(self): 
        self.__thisTekstVlak.event_generate("<<Cut>>") 

    def __kopieeren(self): 
        self.__thisTekstVlak.event_generate("<<Copy>>") 

    def __plakken(self): 
        self.__thisTekstVlak.event_generate("<<Paste>>")    

    def __overMij(self):
        showinfo("Kladblok", "Copyright Timbo") 

    def __nieuweFont(self, *args):
        nieuweFont = (font.get(), fontSize.get())
        open['font'] = nieuweFont
        return nieuweFont

    def __opmaak(self, nieuweFont):
        font = StringVar(self.__root)
        font.set("Times")
        font.trace("w", nieuweFont)
        fontOptions = OptionMenu(self.__root, font, "Arial", "Times", "Helvetica", "Comic")

    #start programma
    def start(self): 
        self.__root.mainloop()

kladblok = Kladblok(width=600,height=400) 
kladblok.start()

Любая помощь с исправлением моего кода будет принята.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы должны предоставить минимальный код, а не весь проект!

Ваша ошибка - вы передали один аргумент, но ожидалось два.

возможное решение:

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()
0 голосов
/ 12 октября 2018

Как указал @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, вам следует использовать лямбда-функцию.Ваш код должен выглядеть примерно так:

       self.__thisOpmaakMenu.add_command(label="Lettergrootte", command=lambda: self.__opmaak(nieuweFont))

По умолчанию передается аргумент self, а также есть место для передачи второго обязательного аргумента nieuweFont

...