Почему мой шрифт не отображается правильно в tkinter? - PullRequest
0 голосов
/ 18 мая 2018

Я создаю простое приложение на python с использованием tkinter, которое включает в себя меню, из которого я могу выбирать различные опции и переходить к новым меню.Я использую ответ, данный Стивеном Васцелларо здесь , чтобы уничтожить кадры, когда я перемещаюсь между ними.В более ранней тестовой версии программы я мог назначить кнопкам свой собственный шрифт и правильно отобразить его, но когда я добавляю мастер, который переключается между различными фреймами, шрифт больше не работает, только делая текст накнопки немного больше.

Версия кода, которая работает правильно, выглядит следующим образом:

import tkinter as tk
from tkinter.font import Font, nametofont
class MainMenu(tk.Frame):              
def __init__(self, master=None):
    tk.Frame.__init__(self, master)   
    self.grid()                       
    self.createWidgets()

def createWidgets(self):
    global myFont
    top=self.winfo_toplevel()                
    top.rowconfigure(0, weight=1)            
    top.columnconfigure(0, weight=1)         
    self.rowconfigure(0, weight=1, pad=50)           
    self.columnconfigure(0, weight=1)        
    self.resume = tk.Button(self, text='Continue', height=2, width=10, font=myFont,  command=self.quit)
    self.library = tk.Button(self, text='Library', height=2, width=10,   command=self.quit)
    self.resume.grid(row=1, column=0,sticky=tk.N+tk.E+tk.W)
    self.library.grid(row=3, column=0,sticky=tk.E+tk.W) 

root = tk.Tk()
global myFont
fontCheck = open("Options.txt","r")
for line in fontCheck:
    if "Font" in line:
        tempLine = line.strip()
        fontDetails = tempLine.split(",")
        print(fontDetails)
myFont = Font(family=fontDetails[1], size=int(fontDetails[2]), weight="bold")
app = MainMenu()
app.mainloop()          
root.destroy()     `

Создание меню, которое выглядит как this

Нокогда я добавляю этот мастер-раздел, он больше не работает:

import tkinter as tk
from tkinter.font import Font, nametofont

class Application(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(MainMenu)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid()

class MainMenu(tk.Frame):              
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)   
        self.grid()                       
        self.createWidgets()

    def createWidgets(self):
        global myFont
        top=self.winfo_toplevel()                
        top.rowconfigure(0, weight=1)            
        top.columnconfigure(0, weight=1)         
        self.rowconfigure(0, weight=1, pad=50)           
        self.columnconfigure(0, weight=1)        
        self.resume = tk.Button(self, text='Continue', height=2, width=10, font=myFont,  command=self.quit)
        self.library = tk.Button(self, text='Library', height=2, width=10,   command=self.quit)
        self.resume.grid(row=1, column=0,sticky=tk.N+tk.E+tk.W)
        self.library.grid(row=3, column=0,sticky=tk.E+tk.W) 

root = tk.Tk()
global myFont
fontCheck = open("Options.txt","r")
for line in fontCheck:
    if "Font" in line:
        tempLine = line.strip()
        fontDetails = tempLine.split(",")
        print(fontDetails)
myFont = Font(family=fontDetails[1], size=int(fontDetails[2]), weight="bold")
app = Application()
app.mainloop()          
root.destroy()  

Он создает меню, похожее на this

Я был бы рад, если бы кто-то мог объяснить, почему шрифтнеправильно работает по всем кадрам и объясните, как я могу решить эту проблему.

1 Ответ

0 голосов
/ 18 мая 2018

Вы создаете 2 экземпляра tk.Tk: один, в котором вы устанавливаете шрифт, и один для вашего приложения.Эти два экземпляра не разделяют шрифт.Решением было бы установить шрифт внутри вашего класса приложения (как метод, вероятно, и при инициализации, скорее всего).

class Application(tk.Tk):
    def __init__(self, *args, fontfile = None, **kw):
        super().__init__(*args, **kw)
        if fontfile is None: fontfile = "Options.txt"

        self._frame = None
        self.fontfile = fontfile
        self.setupFont()
        self.switch_frame(MainMenu)

    def setupFont(self):
        global myFont
        with open(self.fontfile,"r")
        for line in fontCheck:
            if "Font" in line:
                tempLine = line.strip()
                fontDetails = tempLine.split(",")
                print(fontDetails)
        myFont = Font(family=fontDetails[1], size=int(fontDetails[2]), weight="bold")

Несколько других примечаний:

  • Мне не особенно нравится использование global;по моему мнению, предпочтительнее иметь его как атрибут Application или как ttk.Style.
  • Возможно, вы захотите использовать файл опций с предопределенной структурой (рекомендую json), которую можно прочитатьот более явным образом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...