MacOS上的Tkinter Python 3缩放问题

问题描述 投票:2回答:2

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

enter image description here

在2560 x 1600的MacOS上,用户界面中的所有内容均以2倍的大小近似缩放:

enter image description here

原始代码是那个:

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组件或类似的东西硬设置尺寸

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

python python-3.x macos tkinter scaling
2个回答
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)

希望这对您有帮助!


0
投票

因此,如@Bryan Oakley所提出的解决方案是,只需更改Mac OS上默认字体的大小即可。现在我想要一种用户友好的东西,因为我注意到我的Macbook上的结果也不同于用户给出的结果。

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

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()

然后在同一类中,创建scale组件及其事件处理程序(也在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):enter image description here

,这里用比例尺修改为7:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.