Skip to content

Commit 91137ae

Browse files
committed
fix(gui): 修复字体缩放
Closes #IASPCW - 在 clam_theme 和 windows_theme 中使用默认字体大小来计算 Treeview 行高 - 修改 extend_font 函数为 extend_font_scale,以适应不同 DPI - 更新 About 和 Invalid Lines 窗口中的字体使用新的缩放方法 - 优化 HTML 解析器中的标签字体大小设置
1 parent 237880a commit 91137ae

File tree

6 files changed

+25
-19
lines changed

6 files changed

+25
-19
lines changed

src/vcf_generator_lite/theme/clam_theme.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from tkinter import Tk, Misc
1+
from tkinter import Misc, Tk
2+
from tkinter.font import nametofont
23
from tkinter.ttk import Style
34
from typing import override
45

@@ -10,10 +11,12 @@ class ClamTheme(BaseTheme):
1011
def apply_theme(self, master: Misc, style: Style):
1112
super().apply_theme(master, style)
1213
style.theme_use("clam")
14+
default_font = nametofont("TkMenuFont")
15+
default_font_size = int(default_font.actual("size"))
1316

1417
# 重写部分配置以适配高分屏
1518
style.configure("TButton", padding="2.5p")
16-
style.configure("Treeview", rowheight="15p")
19+
style.configure("Treeview", rowheight=f"{default_font_size + 6}p")
1720
style.configure("Heading", padding="2.25p")
1821
style.configure("Vertical.TScrollbar", arrowsize="9p")
1922

src/vcf_generator_lite/theme/widows_theme.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ class WindowsTheme(BaseTheme):
1111
def apply_theme(self, master: Misc, style: Style):
1212
super().apply_theme(master, style)
1313
style.theme_use("vista")
14-
14+
default_font = nametofont("TkMenuFont")
15+
default_font_size = int(default_font.actual("size"))
1516
# 重写部分配置以适配高分屏
1617
style.configure("TButton", padding="2.5p")
17-
style.configure("Treeview", rowheight="15p")
18+
style.configure("Treeview", rowheight=f"{default_font_size + 6}p")
1819
style.configure("Heading", padding="1.5p")
1920

2021
# 自定义组件
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from tkinter.font import nametofont
2-
from typing import TypedDict, Literal
3-
from typing import Unpack
2+
from typing import Literal, TypedDict
43

54

65
class FontConfig(TypedDict, total=False):
@@ -12,7 +11,7 @@ class FontConfig(TypedDict, total=False):
1211
overstrike: bool
1312

1413

15-
def extend_font(origin_name: str, **options: Unpack[FontConfig]):
14+
def extend_font_scale(origin_name: str, scale: float):
1615
font = nametofont(origin_name).copy()
17-
font.config(**options)
16+
font.configure(size=round(int(font.actual("size")) * scale))
1817
return font

src/vcf_generator_lite/widget/tkhtmlview/html_parser.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,11 @@ def _parse_attrs(self, attrs):
288288
except:
289289
pass
290290
elif k in (
291-
HTML.Attrs.HREF,
292-
HTML.Attrs.SRC,
293-
HTML.Attrs.WIDTH,
294-
HTML.Attrs.HEIGHT,
295-
HTML.Attrs.TYPE,
291+
HTML.Attrs.HREF,
292+
HTML.Attrs.SRC,
293+
HTML.Attrs.WIDTH,
294+
HTML.Attrs.HEIGHT,
295+
HTML.Attrs.TYPE,
296296
):
297297
attrs_dict[k] = v
298298
return attrs_dict
@@ -646,8 +646,8 @@ def handle_data(self, data):
646646
data = f"{data} " # FIXME: attaching a space in blind is wrong
647647
data = self._remove_multi_spaces(data)
648648
if len(self.html_tags) and self.html_tags[-1] in (
649-
HTML.Tag.UL,
650-
HTML.Tag.OL,
649+
HTML.Tag.UL,
650+
HTML.Tag.OL,
651651
):
652652
self._w.insert(tk.INSERT, "\t" * 2 * len(self.list_tags))
653653

@@ -712,12 +712,15 @@ def _w_tags_apply_all(self):
712712

713713
# add tags
714714
self.hlink_slots = []
715+
default_font_scaling = int(self.default_font.actual("size")) / 9
715716
for key, tag in self._w_tags.items():
716717
if "config" in tag: # HF change justify to left for tkinter (only supports left, right, center)
717718
if tag["config"].get("justify") == "justify":
718719
tag["config"]["justify"] = "left"
719720
self._w.tag_add(key, tag[WTag.START_INDEX], tag[WTag.END_INDEX])
720721
tag_font = self.default_font.copy() if self.default_font is not None else font.Font()
722+
if "size" in tag[Fnt.KEY]:
723+
tag[Fnt.KEY]["size"] = int(default_font_scaling * tag[Fnt.KEY]["size"])
721724
tag_font.config(**tag[Fnt.KEY])
722725
self._w.tag_config(key, font=tag_font, selectforeground=self.default_selectforeground,
723726
selectbackground=self.default_selectbackground, **tag[WCfg.KEY])

src/vcf_generator_lite/window/about/window.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from vcf_generator_lite.__version__ import __version__
88
from vcf_generator_lite.constants import APP_COPYRIGHT, APP_NAME
99
from vcf_generator_lite.layout.vertical_dialog_layout import VerticalDialogLayout
10-
from vcf_generator_lite.util.tkinter.font import extend_font
10+
from vcf_generator_lite.util.tkinter.font import extend_font_scale
1111
from vcf_generator_lite.widget.menu import TextContextMenu
1212
from vcf_generator_lite.widget.tkhtmlview import HTMLScrolledText
1313
from vcf_generator_lite.window.base import ExtendedDialog
@@ -58,7 +58,7 @@ def _create_header(self, parent: Misc):
5858
app_info_frame,
5959
text=f"{APP_NAME} v{__version__}",
6060
style="DialogHeaderContent.TLabel",
61-
font=extend_font("TkDefaultFont", size=12),
61+
font=extend_font_scale("TkDefaultFont", 12 / 9),
6262
)
6363
app_name_label.pack(anchor=W)
6464
app_copyright_label = Label(app_info_frame, text=APP_COPYRIGHT, style="DialogHeaderContent.TLabel")

src/vcf_generator_lite/window/invalid_lines/window.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import override
55

66
from vcf_generator_lite.layout.vertical_dialog_layout import VerticalDialogLayout
7-
from vcf_generator_lite.util.tkinter.font import extend_font
7+
from vcf_generator_lite.util.tkinter.font import extend_font_scale
88
from vcf_generator_lite.util.tkinter.widget import auto_wrap_configure_event
99
from vcf_generator_lite.widget.scrolled_treeview import ScrolledTreeview
1010
from vcf_generator_lite.window.base import ExtendedDialog
@@ -29,7 +29,7 @@ def _create_header(self, parent: Misc):
2929
self.header_icon = Label(
3030
header_frame,
3131
text="\u26A0",
32-
font=extend_font("TkDefaultFont", size=24),
32+
font=extend_font_scale("TkDefaultFont", 24 / 9),
3333
style="DialogHeaderContent.TLabel"
3434
)
3535
self.header_icon.pack(side=LEFT, padx="14p", pady="7p")

0 commit comments

Comments
 (0)