【问题标题】:Tkinter Python 3 scaling issue on MacOSMacOS 上的 Tkinter Python 3 缩放问题
【发布时间】:2020-09-27 11:31:29
【问题描述】:

我在 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 中的应用程序窗口只是缩短了一点

我尝试过缩放:

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

而且它并没有改变标准解决方案的任何内容,好像没有考虑到它一样

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

还有什么更简单的我可以试试吗?

【问题讨论】:

  • 您的应用使用什么字体?您是指定自定义字体还是使用默认字体?我怀疑最简单的解决方案是更改字体的大小。您不必更改任何组件的大小。
  • @BryanOakley 是的,我不只是使用我猜的默认字体来设置字体。似乎我设法改变了字体大小,我会向我的用户提出这个解决方案,看看它是否有效
  • 如果您使用默认字体,只需几行代码即可更改它们。
  • @BryanOakley 是的,我向我的用户提出了这个建议,看看它是否能解决问题:``` default_font = Font.nametofont("TkDefaultFont") default_font.configure(size=FONT_SIZE) default_font = Font .nametofont("TkTextFont") default_font.configure(size=FONT_SIZE) default_font = Font.nametofont("TkFixedFont") default_font.configure(size=FONT_SIZE)```
  • 你说得对,Bryan,它有效,我将发布我实施的解决方案

标签: python python-3.x macos tkinter scaling


【解决方案1】:

我也有同样的问题!!无论我尝试什么,它总是会有点短。

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

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)

希望对你有帮助!

【讨论】:

  • 这只是做某种全屏还是我弄错了?
  • @Voljega 如果这对您有帮助,请点赞并接受。
  • 抱歉,这不是我想要的解决方案,我想保持窗口显示,而不是全屏,只需解决 MacOS 上的问题。我在@Bryan Oakley 的帮助下找到了解决方案
【解决方案2】:

因此,正如@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()

然后在同一个类中,创建缩放组件及其事件处理程序(也在 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)

这似乎运作良好,虽然它不能解决有关屏幕分辨率和大小的所有问题 窗口的大小可能也必须比自动完成的稍微多一点

这里是默认大小 (9) :

这里用比例尺修改为 7 :

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 2014-10-24
    • 1970-01-01
    • 2020-03-19
    • 2018-01-13
    • 2016-08-30
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多