鱼C论坛

 找回密码
 立即注册
查看: 97|回复: 11

[已解决]Tkinter Message控件的宽度需要一致?

[复制链接]
发表于 2025-8-16 10:55:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. from tkinter import *
  2. root=Tk()
  3. root.geometry("300x500")
  4. root.option_add("*font","汉仪长艺体简 33")
  5. root.option_add("*foreground","navy")
  6. def fe(m):
  7.         for i in m:
  8.                 Message(root,text=i,background="limegreen",aspect=200).pack()
  9. if __name__=="__main__":
  10.         fe(["docx","pdf","jpg","mp3","mp4"])
复制代码


要求:5个 Message 控件的宽度一样大小 !
最佳答案
2025-8-16 16:15:53
from tkinter import *

root = Tk()
root.geometry("300x500")
root.option_add("*font","汉仪长艺体简 33")
root.option_add("*foreground", "navy")

def fe(m):
    # 创建主容器Frame(宽度300像素)
    main_frame = Frame(root, width=300)
    main_frame.pack(pady=0)

    for i in m:
        # 创建内部容器Frame(宽度200像素,绿色背景)
        inner_frame = Frame(
            main_frame,
            width=200,
            height=80,  # 固定高度
            background="limegreen",
            highlightthickness=0  # 去掉边框
        )
        inner_frame.pack(pady=0)  # 添加垂直间距
        inner_frame.pack_propagate(False)  # 固定尺寸

        # 创建Message组件并放入内部容器
        msg = Message(
            inner_frame,
            text=i,
            background="limegreen",
            width=200
        )
        msg.pack(fill="both", expand=True)  # 填充整个内部容器


if __name__ == "__main__":
    fe(["docx", "pdf", "jpg", "mp3", "mp4"])
    root.mainloop()

图像_2025-08-16_105447216.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-16 10:57:37 | 显示全部楼层
在Tkinter中,要使多个 Message 控件的宽度一致,可以通过固定 width 属性(单位为字符数)实现。以下是修改后的代码:


  1. from tkinter import *
  2. root = Tk()
  3. root.geometry("300x500")
  4. root.option_add("*font", "汉仪长艺体简 33")
  5. root.option_add("*foreground", "navy")

  6. def fe(m):
  7.     # 设置固定宽度(例如200字符单位)
  8.     for i in m:
  9.         Message(root,
  10.                 text=i,
  11.                 background="limegreen",
  12.                 width=200  # 关键:固定宽度值
  13.         ).pack()

  14. if __name__ == "__main__":
  15.     # 示例文本列表
  16.     texts = [
  17.         "文本1",
  18.         "较长的文本示例,但宽度会保持一致",
  19.         "文本3",
  20.         "另一段更长的文本内容,同样受宽度限制自动换行",
  21.         "最后一条"
  22.     ]
  23.     fe(texts)
  24.     root.mainloop()
复制代码


### 关键说明:
1. width=200:所有控件使用相同的字符宽度单位(200个平均字符宽度)
2. 效果:
   - 短文本两侧留白
   - 长文本自动换行但宽度不变
   - 所有控件宽度严格一致

### 注意事项:
- 调整 width 值可控制实际宽度(值越大越宽)
- 删除 aspect 参数,因其与固定宽度冲突
- 文本超宽时会自动换行,高度自适应

> 提示:若需像素级精确控制,建议改用 Label + wraplength 方案,但 Message 在长文本换行时更稳定。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 12:31:57 | 显示全部楼层
试试

  1. from tkinter import *
  2. root = Tk()
  3. root.geometry("300x500")
  4. root.option_add("*font", "汉仪长艺体简 33")
  5. root.option_add("*foreground", "navy")

  6. def fe(m):
  7.     # 设置固定宽度(根据窗口宽度调整)
  8.     fixed_width = 250
  9.     for i in m:
  10.         Message(root,
  11.                text=i,
  12.                background="limegreen",
  13.                aspect=200,
  14.                width=fixed_width).pack()

  15. if __name__ == "__main__":
  16.     fe(["docx", "pdf", "jpg", "mp3", "mp4"])
  17.     root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-16 13:04:15 | 显示全部楼层


不能固定宽度的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 13:38:23 | 显示全部楼层

  1. from tkinter import *
  2. root = Tk()
  3. root.geometry("300x500")
  4. root.option_add("*font", "汉仪长艺体简 33")
  5. root.option_add("*foreground", "navy")

  6. def fe(m):
  7.     # 设置固定宽度(根据窗口宽度调整)
  8.     fixed_width = 250
  9.     for i in m:
  10.         Message(root,
  11.                text=i,
  12.                background="limegreen",
  13.                width=fixed_width).pack()

  14. if __name__ == "__main__":
  15.     fe(["docx", "pdf", "jpg", "mp3", "mp4"])
  16.     root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 13:57:25 | 显示全部楼层
使用Label替代Message,设置固定宽度(像素单位)
from tkinter import *

root = Tk()
root.geometry("300x500")
root.option_add("*font", "汉仪长艺体简 33")
root.option_add("*foreground", "navy")

def fe(m):
    frame = Frame(root, width=300)
    frame.pack()

    for i in m:
        lbl = Label(
            frame,
            text=i,
            background="limegreen",
            anchor="w",  # 文本左对齐
            padx=10,  # 增加左右内边距
            pady=5,  # 增加上下内边距
            wraplength=200
        )
        lbl.pack(fill="x", pady=0)

if __name__ == "__main__":
    fe(["docx", "pdf", "jpg", "mp3", "mp4"])
    root.mainloop()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-16 14:03:01 | 显示全部楼层
ydwb 发表于 2025-8-16 13:57
使用Label替代Message,设置固定宽度(像素单位)
from tkinter import *



使 用 Label 是 可 以 的 ,现 在 是 要 使 用 Message 啊 !
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-16 14:05:09 | 显示全部楼层


不 行 啊 !
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 15:03:15 | 显示全部楼层
你既然用message 就应该创一个msg 变量
然后加换行和新内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 15:03:46 | 显示全部楼层
要不然还不如Label
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-16 15:19:04 | 显示全部楼层


Label 很容易就做到了,对于 Message 我再想一想!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-16 16:15:53 | 显示全部楼层    本楼为最佳答案   
from tkinter import *

root = Tk()
root.geometry("300x500")
root.option_add("*font","汉仪长艺体简 33")
root.option_add("*foreground", "navy")

def fe(m):
    # 创建主容器Frame(宽度300像素)
    main_frame = Frame(root, width=300)
    main_frame.pack(pady=0)

    for i in m:
        # 创建内部容器Frame(宽度200像素,绿色背景)
        inner_frame = Frame(
            main_frame,
            width=200,
            height=80,  # 固定高度
            background="limegreen",
            highlightthickness=0  # 去掉边框
        )
        inner_frame.pack(pady=0)  # 添加垂直间距
        inner_frame.pack_propagate(False)  # 固定尺寸

        # 创建Message组件并放入内部容器
        msg = Message(
            inner_frame,
            text=i,
            background="limegreen",
            width=200
        )
        msg.pack(fill="both", expand=True)  # 填充整个内部容器


if __name__ == "__main__":
    fe(["docx", "pdf", "jpg", "mp3", "mp4"])
    root.mainloop()

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-27 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表