【问题标题】:Rgb color effect in a label text, tkinter python标签文本中的RGB颜色效果,tkinter python
【发布时间】:2021-09-28 18:15:02
【问题描述】:

您好,我只是在尝试一些代码,我正在尝试更改标签内文本的颜色(例如物理键盘中的 rgb 颜色效果),使用以下代码我确实可以更改颜色,但是我我试图实现的是让文本的每个字母的颜色发生变化,但我不知道该怎么做。

下面是我写的代码:

import tkinter as tk
import time
import random

color_list = ["red","blue","green","cyan1","yellow","purple"]



root = tk.Tk()
root.geometry("800x600")


i=0

txt = "Hello world"

l1 = tk.Label(root, text=txt)
l1.pack(pady=10)



def text():
   #global i 
   global l1
   global root
   global color_list
   global txt
   try:
      while True:
        #for j in range(0,len(txt)):
        random_value = random.randint(0,5)
        l1.config(fg=f"{color_list[random_value]}")
        l1.update()
        time.sleep(1)

    '''if i == 100:
        l1.config(text="Process completed")
        time.sleep(5)
        root.destroy()'''
      print()

except:
    print("Program Exited")

root.after(3000, lambda: text())
root.mainloop() 

【问题讨论】:

  • 你不能用标签做到这一点。对于某个单词,最简单的方法是使用 pil 并绘制文本图片。另一种更努力的方法可能是文本小部件或使用画布。
  • 我之前用canvas试过,但是确实不能让我配置文本的前景。不过,我会尝试使用 Pillow,谢谢您的信息!
  • 按照 Atlas435 的建议,您可以使用 tkinter.Text 制作多色标签。如果你想让它不能被输入,你可以使用Text.config(state="disabled"),并使用标签设置颜色。 Text 也有比Label 更多的格式选项。只是一个建议。
  • 如果您想要更多选项,然后创建一个框架(这将是您的整个字母表),然后将这些字母中的每一个单独放在一个框架上,并将其网格在同一行上。然后你可以手动给它们一个颜色
  • @CoolCloud 你能解释一下吗?我不太明白你的意思。

标签: python tkinter


【解决方案1】:

正如 cmets 中所述,使用 Text 是一种方法,但我觉得使用 Frame 与您所做的方法更相似。基本思想是创建一个类似于整个句子/单词的主框架,然后将每个字母创建为单独的标签,并更改其颜色。您不应该使用while,因为它会干扰mainloop,导致应用程序冻结。

import tkinter as tk
import random

root = tk.Tk()
color_list = ["red","blue","green","cyan1","yellow","purple"]
text = 'Hello World'

def change():
     for wid in alpha.winfo_children(): # Each letter 
          rand = random.randint(0,len(color_list)-1) # Get a random color
          wid.configure(fg=color_list[rand]) # Change the letter to that random color
     
     root.after(50,change) # Repeat every 50 millisecond

alpha = tk.Frame(root)
alpha.pack()

count = 0
for idx,letter in enumerate(text):
     tk.Label(alpha,text=letter,fg=color_list[count],font=(0,21)).grid(row=0,column=idx)
     if count < len(color_list)-1: 
          count += 1
     else:
          count = 0

change()
root.mainloop()

大部分代码都是不言自明的。

【讨论】:

  • 看起来很酷!请注意:不鼓励使用通配符导入。
  • @SamMatzko 是的,我意识到这一点,但是在回答时我通常倾向于使用这个(只是出于实践),我希望 OP 已经知道这一点并在其原始代码中使用正确的方式,但是随意更改。
  • 查看您的编辑,我认为使用 import tkinter as tk 更好,因为虽然它不是通配符导入,但与简单的 import tkinter 相比,它仍然可以节省输入时间。
  • @CoolCloud 谢谢,它起作用了,但是颜色变化太快了,所以也许我可以使用 time.sleep() 减慢它?
  • @bruce_wayne224 root.after(50,change),调整时间(50),使其适合您的需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多