Tkinter Python 3 MacOS 上的缩放问题

Tkinter Python 3 scaling issue on MacOS

我正在 Python3/Tkinter 中维护一个应用程序并添加一个由我的第一个用户在 MacOS 上打开的问题。 这是 Windows 上的 1080p 主屏幕(Linux 显示类似结果):

在 2560 x 1600 的 MacOS 上,UI 中的所有内容都近似缩放为 2 倍大小:

原来的代码是那个:

self.window = Tk.Tk()
self.window.resizable(False,False)
if platform.system() == 'Windows' :
   self.window.iconbitmap('bestarcade.ico')
self.window.title(title)

我尝试执行解决方案:

self.scriptDir = scriptDir
self.window = Tk.Tk()
self.window.geometry("930x950")
self.window.resizable(False,False)

更糟的是,MacOS 中的应用程序 window 只是缩短了一点

我试过缩放:

self.scriptDir = scriptDir
self.window = Tk.Tk()
self.window.tk.call('tk','scaling',0.5)
self.window.resizable(False,False)

而且它与标准解决方案没有任何变化,就好像没有考虑到它一样

根据我的阅读,这似乎是 MacOS 上的 Tkinter 错误,我发现的唯一解决方案需要为每种字体和 UI 组件或类似的东西硬设置尺寸

我可以尝试更简单的方法吗?

我有完全相同的问题!!无论我尝试什么,它总是有点短。

最后,这就是我所做的。看看它是否适合你。

from tkinter import *
window = Tk()
window.title("Whatever you want")

window.focus()

HEIGHT = window.winfo_screenwidth()
WIDTH = window.winfo_screenheight()
RESOL = str(HEIGHT) + "x" + str(WIDTH+7) + "+" + str(-7) + "+" + str(0)
window.geometry(RESOL)

希望对您有所帮助!

因此,正如@Bryan Oakley 提出的那样,解决方案只是更改 Mac OS 上默认字体的大小。 现在我想要一些用户友好的东西,因为我注意到我的 macbook 上的结果也与用户给出的结果不同。

我选择使用 Scale Tkinter 组件来允许用户自己更改字体大小:

编辑:为了解决方案而保留,但实际上 Scale 小部件似乎也不兼容所有 MacOS 版本,因为它根本没有出现在其中一些。

GUI 的首次初始化:

class GUI():

MACOS_DEFAULT_FONT_SIZE = 7
DEFAULT_FONT_SIZE = 9      

def __init__(self,scriptDir,logger,title) :        
    self.scriptDir = scriptDir
    
    self.window = Tk.Tk()
    self.window.resizable(False,False)        
    self.startFontSize = self.DEFAULT_FONT_SIZE        
    
    if platform.system() == 'Windows' :
        self.window.iconbitmap('bestarcade.ico')
    elif platform.system() == 'Darwin' :
        # Handle tkinter font size bug on MacOS
        self.startFontSize = self.MACOS_DEFAULT_FONT_SIZE
        
    self.setFontSize(self.startFontSize)
    self.window.title(title)        
    self.logger = logger

def draw(self) :
    self.root = Tk.Frame(self.window,padx=10,pady=5)
    self.root.grid(column=0,row=0)
    self.drawSliderFrame()
    self.drawMainframe()
    self.window.mainloop()

然后在相同的 class 中,创建比例组件及其事件处理程序(也在 GUI 初始化期间使用):

def setFontSize(self, value) :        
    default_font = Font.nametofont("TkDefaultFont")
    default_font.configure(size=value)
    text_font = Font.nametofont("TkTextFont")
    text_font.configure(size=value)
    fixed_font = Font.nametofont("TkFixedFont")
    fixed_font.configure(size=value)

def drawSliderFrame(self) :
    self.sliderFrame = Tk.Frame(self.root,padx=10,pady=0)
    self.sliderFrame.grid(column=0,row=0,sticky="EW",pady=0)
    self.sliderFrame.grid_columnconfigure(0, weight=1)
    self.slider = Tk.Scale(self.sliderFrame, from_=4, to=12, orient=Tk.HORIZONTAL, showvalue=0, command=self.setFontSize)
    wckToolTips.register(self.slider, 'Window Size') #TODO internationalization
    self.slider.grid(column=0,row=0,sticky="W",pady=0)
    self.slider.set(self.startFontSize)

这似乎工作得很好,虽然它没有解决所有关于屏幕分辨率和尺寸的问题 windows 的大小也可能必须比自动完成的减少少一点

这是默认大小 (9) :

并在此处将比例修改为 7 号: