在Python中进行编码时遇到问题,我找不到解决方案。我有一个tkinter网格,它可以自动调整大小以适合其所在窗口的大小,但是我希望按钮/标签内的文本也可以调整大小以适合新的网格。下面是一个基本示例:
from tkinter import *
root = Tk()
for x in range(3):
for y in range(3):
Label(root, width = 2, height = 4, text = (y * 3 + x) + 1, relief = GROOVE).grid(row = y, column = x, sticky = N+E+S+W)
Grid.rowconfigure(root, y, weight = 1)
Grid.columnconfigure(root, x, weight = 1)
root.mainloop()
当您拖动窗口以展开文本时,我希望文本增加。该怎么办?
编辑:
Mike-SMT的解决方案效果很好,但是不适用于我在其答复的评论中描述的情况。
这是我的代码:
from tkinter import *
import tkinter.font as tkFont
grey = [0,1,2,6,7,8,9,10,11,15,16,17,18,19,20,24,25,26,30,31,32,39,40,41,48,49,50,54,55,56,60,61,62,63,64,65,69,70,71,72,73,74,78,79,80]
btn_list = []
filled = []
filled_ID = []
class GUI(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.screen_init()
self.key = None
self.keydetection = False
self.detect()
self.bind_all("<Key>", self.key_event)
def screen_init(self, master = None):
for x in range(9):
for y in range(9):
btn_list.append(Button(master, width = 40, height = 40, image = pixel, compound = CENTER, bg = "#D3D3D3" if 9 * y + x in grey else "#FFFFFF", command = lambda c = 9 * y + x: self.click(c)))
btn_list[-1].grid(row = y, column = x, sticky = N+E+S+W)
Grid.rowconfigure(root, y, weight = 1)
Grid.columnconfigure(root, x, weight = 1)
def update(self, btn_ID, number = None, colour = "#000000", master = None):
y = btn_ID // 9
x = btn_ID % 9
Button(master, width = 40, height = 40, image = pixel, text = number, compound = CENTER, fg = colour, bg = "#D3D3D3" if 9 * y + x in grey else "#FFFFFF", command = lambda c = 9 * y + x: self.click(c)).grid(row = y, column = x, sticky = N+E+S+W)
def detect(self):
self.keydetection = not self.keydetection
def key_event(self, event):
try:
self.key = int(event.keysym)
except:
print("Numbers Only!")
def click(self, btn_ID):
if btn_ID in filled:
filled_ID.pop(filled.index(btn_ID))
filled.remove(btn_ID)
window.update(btn_ID)
else:
filled.append(btn_ID)
filled_ID.append(self.key)
window.update(btn_ID, self.key)
def font_resize(event=None):
for btn in btn_list:
x = btn.winfo_width()
y = btn.winfo_height()
if x < y:
btn.config(font=("Courier", (x-10)))
else:
btn.config(font=("Courier", (y-10)))
if __name__ == '__main__':
root = Tk()
root.title("Example")
pixel = PhotoImage(width = 1, height = 1)
font = tkFont.Font(family = "Helvetica")
window = GUI(root)
root.bind("<Configure>", font_resize)
root.mainloop()
这意味着当用户按数字键选择一个数字,然后单击他们希望该数字出现在网格中的位置时,最初运行代码时,文本不在网格中。打破Mike-SMT的解决方案。有修复程序吗?
答案 0 :(得分:1)
我将使用列表来跟踪每个标签。然后在调整窗口大小时将新的文本大小应用于标签。您还需要提供一个1x1像素的图像,以便标签读取像素大小与文本高度的大小。
我将为此使用grid()
,但是使用pack()
可以很容易地做到这一点。
因为我们使用的是grid()
,所以我们需要确保在每列/行上设置权重,标签将使用rowconfigure()
和columnconfigure()
来设置。
我们将需要的功能应该检查小部件的高度和宽度,然后根据较小的数字设置字体对象的大小。这样可以防止字体变得大于标签大小。
import tkinter as tk
import tkinter.font as tkFont
root = tk.Tk()
label_list = []
font = tkFont.Font(family="Helvetica")
pixel = tk.PhotoImage(width=1, height=1)
for x in range(3):
for y in range(3):
root.rowconfigure(y, weight=1)
root.columnconfigure(x, weight=1)
label_list.append(tk.Label(root, width=40, height=40, image=pixel, text=(y * 3 + x) + 1, relief="groove", compound="center"))
label_list[-1].grid(row=x, column=y, sticky="nsew")
def font_resize(event=None):
for lbl in label_list:
x = lbl.winfo_width()
y = lbl.winfo_height()
if x < y:
lbl.config(font=("Courier", (x-10)))
else:
lbl.config(font=("Courier", (y-10)))
root.bind( "<Configure>", font_resize)
root.mainloop()
结果:
无论如何调整窗口大小,它都应始终具有大致最大的字体,而不会超出标签大小。
更新:
我确实在您的代码中做了一些更改。我将您创建btn_ID
的方式更改为较简单的方式以及可以与update方法一起使用的方式。如果您有任何问题,请告诉我。
要回答已更改的问题和您的评论,请在此处重新编写新代码,以执行所需的操作:
from tkinter import *
import tkinter.font as tkFont
grey = [0,1,2,6,7,8,9,10,11,15,16,17,18,19,20,24,25,26,30,31,32,39,40,41,48,49,50,54,55,56,60,61,62,63,64,65,69,70,71,72,73,74,78,79,80]
class GUI(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pixel = PhotoImage(width=1, height=1)
self.font = tkFont.Font(family="Helvetica")
self.master.bind("<Configure>", self.font_resize)
self.btn_list = []
self.filled = []
self.filled_ID = []
self.screen_init()
self.key = None
self.keydetection = False
self.detect()
self.bind_all("<Key>", self.key_event)
root.bind( "<Configure>", self.font_resize)
def screen_init(self, master=None):
btn_ndex = 0
for x in range(9):
for y in range(9):
self.btn_list.append(Button(master, font=self.font, width=40, height=40, image=self.pixel, compound=CENTER, bg="#D3D3D3" if 9 * y + x in grey else "#FFFFFF", command=lambda c=btn_ndex: self.click(c)))
self.btn_list[-1].grid(row=y, column=x, sticky="nsew")
root.rowconfigure(y, weight=1)
root.columnconfigure(x, weight=1)
btn_ndex += 1
def font_resize(self, event=None):
for btn in self.btn_list:
x = btn.winfo_width()
y = btn.winfo_height()
if x < y:
self.font.configure(size=x-10)
else:
self.font.configure(size=y-10)
def update(self, btn_ID, number=None, colour="#000000", master=None):
print(btn_ID)
y = btn_ID // 9
x = btn_ID % 9
self.btn_list[btn_ID].config(text=number, fg=colour, bg="#D3D3D3" if 9 * y + x in grey else "#FFFFFF", command=lambda c=9 * y + x: self.click(c))
def detect(self):
self.keydetection=not self.keydetection
def key_event(self, event):
try:
self.key=int(event.keysym)
except:
print("Numbers Only!")
def click(self, btn_ID):
if btn_ID in self.filled:
self.filled_ID.pop(self.filled.index(btn_ID))
self.filled.remove(btn_ID)
window.update(btn_ID)
else:
self.filled.append(btn_ID)
self.filled_ID.append(self.key)
window.update(btn_ID, self.key)
if __name__ == '__main__':
root = Tk()
root.title("Example")
window = GUI(root)
root.mainloop()