【问题标题】:Recreating Tkinter Widgets with new Font and Size使用新的字体和大小重新创建 Tkinter 小部件
【发布时间】:2018-05-02 12:51:18
【问题描述】:

我正在尝试创建一个程序,允许用户更改窗口中标签的字体。我很难弄清楚如何用新字体重新创建所有标签。这是我目前所拥有的:

import tkinter as tk
from tkinter import messagebox, colorchooser, simpledialog, filedialog, font

root = tk.Tk()
root.withdraw()

screenHieght = root.winfo_screenheight()  # height of the screen
screenWidth = root.winfo_screenwidth()  # width of the screen

windowHieght = screenHieght / 2  # Turtle window is half of screen size
windowWidth = screenWidth / 2

x = (screenWidth / 2) - (windowWidth / 2)
y = (screenHieght / 2) - (windowHieght / 2)

root.geometry('%dx%d+%d+%d' % (windowWidth, windowHieght, x, y))  # Some assistance from Google on centering the window
root.columnconfigure(3, weight=2)
root.columnconfigure(1, weight=1)
root.columnconfigure(5, weight=1)
root.rowconfigure(1, weight=2)
root.rowconfigure(3, weight=1)
root.rowconfigure(4, weight=1)
root.rowconfigure(5, weight=1)
root.configure(background="#a1dbcd")

def changeFont(selection):
    global selectedfont
    global setfontstyle
    print(selection)
    selectedfont = selection
    print(setfontstyle)

def changeSize(val):
    print(val)
    global setfontstyle
    global fontsize
    fontsize = val
    print(setfontstyle)

def newfontstyle():
    global setfontstyle
    global selectedfont
    global fontsize
    setfontstyle = font.Font(family = selectedfont, size = fontsize)


fontsize = tk.IntVar(root)
selectedfont = tk.StringVar(root)
setfontstyle = font.Font(family=selectedfont, size=12, weight='normal')

def atributes():
    while True:
        global setfontstyle
        global selectedfont
        global fontsize
        fontchoose = ["Arial", "Courier New", "Comic Sans MS", "Fixedsys", "MS Sans Serif", "MS Serif", "Symbol",
                      "System",
                      "Times New Roman", "Verdana"]

        selectedfont.set("Arial")
        # Variables and stuff

        label1 = tk.Label(root, text="Select your options", font=setfontstyle).grid(row=1, column=3, pady=10,
                                                                                    sticky=tk.E + tk.W + tk.N + tk.S)
        label2 = tk.Label(root, text="Font Style", font=setfontstyle).grid(row=3, column=5, pady=10,
                                                                           sticky=tk.E + tk.W + tk.N + tk.S)
        fontdropdown = tk.OptionMenu(root, selectedfont, *fontchoose, command=changeFont).grid(row=4, column=5, pady=10,
                                                                                               sticky=tk.E + tk.W + tk.N + tk.S)
        label3 = tk.Label(root, text="Font Size", font=setfontstyle).grid(row=3, column=1, pady=10,
                                                                          sticky=tk.E + tk.W + tk.N + tk.S)
        fontsize = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, command=changeSize).grid(row=4, column=1,
                                                                                                  pady=10,
                                                                                                  sticky=tk.E + tk.W + tk.N + tk.S)
        redoall = tk.Button(root, text="Recreate", font=setfontstyle, command=newfontstyle).grid(
            row=5, column=3, pady=10, sticky=tk.E + tk.W + tk.N + tk.S)

        # print(fontdropdown)
        root.deiconify()
        # root.wait_variable(selectedfont or fontsize)
        root.mainloop()

感谢您的帮助。这几天我一直在努力寻找答案。

【问题讨论】:

  • 您不需要重新创建标签。您可以更改现有标签的字体。见stackoverflow.com/a/4073037/7432
  • 但是我如何一次获得所有标签。有没有办法可以使用 for 循环之类的?
  • 如果你阅读了我发布的链接,你根本不需要对标签做任何事情。给他们所有相同的字体对象,然后你只需要更改一个字体对象。
  • 对不起,我有点困惑。我很确定我使用setfontstyle 作为我的字体对象。但是,当我修改它时,什么都没有改变
  • 与问题无关,你为什么要在循环中调用mainloop,或者这只是你发布代码的错误?另外,请发布实际运行的代码。当我运行您的代码时,它什么也不做(可能是因为没有调用 atributes.

标签: python python-3.x tkinter tk


【解决方案1】:

您无需重新创建任何内容。由于您使用的是字体对象,您只需修改该字体对象,任何使用该对象的字体都会立即显示新字体。

def changeFont(selection):
    setfontstyle.configure(family=selection)

def changeSize(val):
    setfontstyle.configure(size=val)

您的代码中还有其他错误,但这回答了您的具体问题。

这是一个简短的示例程序,它显示了当您更改字体属性时小部件如何立即更改:

import tkinter as tk
import tkinter.font

font_families = [
    "Arial", "Courier New", "Comic Sans MS", "Fixedsys",
    "MS Sans Serif", "MS Serif", "Symbol",
    "System", "Times New Roman", "Verdana"
]

def changeSize(val):
    appFont.configure(size=val)

def changeFont(family):
    appFont.configure(family=family)


root = tk.Tk()
root.geometry("400x200")

fontFamily = tk.StringVar(value="Arial")
fontSize = tk.IntVar(value=12)

appFont = tk.font.Font(family=fontFamily.get(), size=fontSize.get(), weight='normal')

size_widget = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL,
                       command=changeSize, variable=fontSize)
family_widget = tk.OptionMenu(root, fontFamily, *font_families, command=changeFont)
label = tk.Label(root, text="Hello, world", font=appFont)

label.pack(side="top", fill="both", expand=True)
size_widget.pack(side="bottom", fill="x", expand=False)
family_widget.pack(side="bottom", fill="x", expand=False)

root.mainloop()

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2020-09-07
    • 2011-07-23
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多