gpt4 book ai didi

button - Python3 : How to dynamically resize button text in tkinter/ttk?

转载 作者:行者123 更新时间:2023-12-01 14:41:08 27 4
gpt4 key购买 nike

我想知道如何安排 ttk 小部件(例如标签或按钮)上的文本自动调整大小。

更改文本的大小很容易,只需更改样式中的字体即可。然而,将它与窗口大小的变化 Hook 有点棘手。在网上我发现了一些提示,但没有发布完整的答案。

所以,下面是一个完整的工作示例,作为我自己问题的答案。我希望有人觉得它有用。如果有人有进一步的改进建议,我会很高兴看到他们!

最佳答案

下面的例子展示了两种技术,一种是通过重新调整窗口大小来激活(见 resize() 方法,绑定(bind)到 <Configure> 事件),另一种是直接改变字体大小(见 mutate() 方法) )。

其他需要调整大小的代码是 __init__() 中的网格配置代码。方法。

运行示例时,两种方法之间存在一些交互,但我认为在“真实”情况下,一种技术就足够了,因此不会出现该问题。

from tkinter import *
from tkinter.ttk import *


class ButtonApp(Frame):
"""Container for the buttons."""

def __init__(self, master=None):
"""Initialize the frame and its children."""

super().__init__(master)
self.createWidgets()

# configure the frame's resize behaviour
master.columnconfigure(0, weight=1)
master.rowconfigure(0, weight=1)
self.grid(sticky=(N,S,E,W))

# configure resize behaviour for the frame's children
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(0, weight=1)

# bind to window resize events
self.bind('<Configure>', self.resize)


def createWidgets(self):
"""Make the widgets."""

# this button mutates
self.mutantButton = Button(self, text='Press Me',
style='10.TButton')
self.mutantButton.grid(column=0, row=0, sticky=(N,S,E,W))
self.mutantButton['command'] = self.mutate

# an ordinary quit button for comparison
self.quitButton = Button(self, text='Quit', style='TButton')
self.quitButton.grid(column=0, row=1, sticky=(N,S,E,W))
self.quitButton['command'] = self.quit


def mutate(self):
"""Rotate through the styles by hitting the button."""

style = int(self.mutantButton['style'].split('.')[0])
newStyle = style + 5
if newStyle > 50: newStyle = 10
print('Choosing font '+str(newStyle))
self.mutantButton['style'] = fontStyle[newStyle]

# resize the frame

# get the current geometries
currentGeometry = self._root().geometry()
w, h, x, y = self.parseGeometry(currentGeometry)
reqWidth = self.mutantButton.winfo_reqwidth()
reqHeight = self.mutantButton.winfo_reqheight()

# note assume height of quit button is constant at 20.
w = max([w, reqWidth])
h = 20 + reqHeight
self._root().geometry('%dx%d+%d+%d' % (w, h, x, y))


def parseGeometry(self, geometry):
"""Geometry parser.
Returns the geometry as a (w, h, x, y) tuple."""

# get w
xsplit = geometry.split('x')
w = int(xsplit[0])
rest = xsplit[1]

# get h, x, y
plussplit = rest.split('+')
h = int(plussplit[0])
x = int(plussplit[1])
y = int(plussplit[2])

return w, h, x, y


def resize(self, event):
"""Method bound to the <Configure> event for resizing."""

# get geometry info from the root window.
wm, hm = self._root().winfo_width(), self._root().winfo_height()

# choose a font height to match
# note subtract 30 for the button we are NOT scaling.
# note we assume optimal font height is 1/2 widget height.
fontHeight = (hm - 20) // 2
print('Resizing to font '+str(fontHeight))

# calculate the best font to use (use int rounding)
bestStyle = fontStyle[10] # use min size as the fallback
if fontHeight < 10: pass # the min size
elif fontHeight >= 50: # the max size
bestStyle = fontStyle[50]
else: # everything in between
bestFitFont = (fontHeight // 5) * 5
bestStyle = fontStyle[bestFitFont]

# set the style on the button
self.mutantButton['style'] = bestStyle


root = Tk()
root.title('Alice in Pythonland')

# make a dictionary of sized font styles in the range of interest.
fontStyle = {}
for font in range(10, 51, 5):
styleName = str(font)+'.TButton'
fontName = ' '.join(['helvetica', str(font), 'bold'])
fontStyle[font] = styleName
Style().configure(styleName, font=fontName)

# run the app
app = ButtonApp(master=root)
app.mainloop()
root.destroy()

关于button - Python3 : How to dynamically resize button text in tkinter/ttk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com