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 号:
我正在 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 号: