问题描述
我是 Python 3 中 GUI 和 Tkinter 的新手。我的程序打算从用户那里获取一个字符串并将其显示在 消息 小部件中。然而,由于文本的动态长度,小部件的尺寸不断变化,这导致根窗口的 GUI 结构发生变化(根据输入的文本(字符串)大小)。我使用 grid() 系统来定位小部件。
为了保留结构以便小部件不会改变它们的尺寸(因此,位置),我该如何改变字体大小,以便小部件包含整个文本(字符串),但是,保持定义的尺寸?
例如,我希望我的小部件尺寸为 而不是 下载图像以查看高度和宽度的明显差异。此更改也使其他小部件改变 GUI 结构(我希望对于任何长度的文本作为输入都相同)
因此,为了补偿增加的文本长度,我希望程序使后者的字体更小,以便小部件的尺寸保持前者的尺寸(尺寸在源代码中固定)。
import random
from tkinter import *
interface=Tk()
..
..
#here <abr> is the dynamic text given as input to the program as a string.
#here <abstract> is the widget (here,a Message widget) under consideration
color_codes=['#90eeed','#d681ff','#faf1ae','#57b1f4','#e5dcd4']
abstract = Message(interface,text=abr,font=('Century',15),aspect=350,bg=random.choice(color_codes),justify=CENTER)
abstract.grid(row=200,column=1)
abstract.update()
..
..
我不想在根窗口中添加滚动功能。任何其他替代建议(保留结构)都会有所帮助。
谢谢。
解决方法
与几何管理器存在一些差异。有些更容易“修复”其他人则不然。总的来说,它们也可以组合在一起。然而,网格方法是动态效果较差的选择。
我从您的代码中得知您正在寻找颜色变化方面的动态内容?你可以“骰子”十六进制。这是一个例子
from tkinter import * # IMPORTS //////////////////
import random
root = Tk() # WINDOW ATTRIBUTES ////////
width = root.winfo_screenwidth() / 2.5
height = root.winfo_screenheight() / 3.5
root.geometry("400x400+%d+%d" % (width,height))
root.attributes("-transparent","red")
root.overrideredirect(1)
def circular(): # LABEL // CANVAS OUTSIDE //
global GLOBAL_STATE,EXTENT # FUNC()
if GLOBAL_STATE == 0:
main_canvas.itemconfig(outer_arc,extent=EXTENT,start=EXTENT,fill="#"+("%06x"%random.randint(0,16777215)))
main_label.configure(text="CPU-HEAT\n"+("%d"%random.randint(0,9999999)+"°C"),fg="#"+("%06x"%random.randint(0,16777215)))
exit_button.configure(fg="#"+("%06x"%random.randint(0,16777215)),activeforeground="#"+("%06x"%random.randint(0,16777215)))
main_canvas.after(10,circular)
EXTENT += 3.6
def circular_in(): # CANVAS INSIDE FUNC() /////
global GLOBAL_STATE,EXTENT_IN
if GLOBAL_STATE == 0:
main_canvas.itemconfig(inner_arc,extent=EXTENT_IN,start=EXTENT_IN,16777215)))
main_canvas.itemconfig(oval_blink,16777215)))
main_canvas.after(15,circular_in)
EXTENT_IN -= 3.6
GLOBAL_STATE = 0 # STATEMENTS // GLOBAL /////
EXTENT = 0
EXTENT_IN = 0
main_canvas = Canvas(root,bg="red",highlightthickness=0) ##==> CREATE CANVAS
oval_blink = main_canvas.create_oval(10,10,390,390) ##==> OVAL BLINKING
oval_main = main_canvas.create_oval(15,15,385,fill="#050707") ##==> OVAL CONTAINER
outer_arc = main_canvas.create_arc(22,22,378,fill="red",start=90) ##==> CREATE ARC
oval_inner = main_canvas.create_oval(26,26,374,fill="black") ##==> CREAT INNER LINE
oval_main = main_canvas.create_oval(40,40,360,fill="#050707") ##==> OVAL CONTAINER
inner_arc = main_canvas.create_arc(60,60,340,start=90) ##==> CREATE ARC
oval_lblcon = main_canvas.create_oval(65,65,335,fill="#080a0b") ##==> OVAL LBL CONT.
main_canvas.pack(fill=BOTH,expand=YES)
main_label = Label(main_canvas,font=("Consolas",30),bg="#080a0b")
main_label.place(x=105,y=145)
exit_button = Button(main_canvas,bg="#080a0b",text="\u26CC",bd=0,font=("Segoe UI",22),##==> EXIT APP /////////
activebackground="#080a0b",command=root.destroy)
exit_button.place(x=175,y=80)
if __name__ == '__main__': # RUN APP //////////////////
circular()
circular_in()
root.mainloop()