2017-07-24 85 views
0

所以我抓住了一个网站上的事件链接,并将它们放入一个下拉菜单中进行选择。我的菜单代码:更改tk选项菜单中单个单词的颜色?

import Tkinter as tk  
from Tkinter import StringVar 

selectMenu = tk.Tk() 


# #-> this is what I have 
# Followed by what you can use 


#var = Vars() 
#events = var.GetVars('Event') 
events = " " 
options = [] 
links = [] 
#forms = (driver.find_elements_by_class_name("with-cats")) #This is what I have 
forms = ["Yolo ","Dad? Closed","Anotha One","Normies! Closed"] #This is so you can try it for yourself 

for x in forms: 
    #info = x.text 
    info = x #Again, this is so you can try it for yourself 
    if events in info.lower(): 
     links.append(x) 

for link in range(0,len(links)): 
    #options.append(links[link].text) 
    options.append(links[link]) 
list(set(options)) 

selection = [] 
for link in range(0,len(options)): 
    selection.append(options[link]) 
select = StringVar(selectMenu) 
select.set("--None Selected--") 

menu = tk.OptionMenu(selectMenu, select, *(selection)) 

msg = "Which one would you like to attend?" 
label = tk.Label(selectMenu, text=msg, font="Helvedica 14") 

label.pack(side='top', pady=10) 
menu.pack(side="top", pady=10)  

selectMenu.attributes('-topmost', True) 
selectMenu.mainloop() 

所以此工程罚款和花花公子,但我想改善一下,以使其更明显的事件是开放的。为了澄清,发现一个事件被打开并放入菜单可能看起来像“这是一个很酷的事件”,但是一个被关闭的事件将被视为“这是一个很酷的事件已关闭”。我的目标是能够使前景变成红色,不管是Closed还是包含Closed的字符串(如果有可能的话)(我不确定是否可能,因为osx上的菜单和按钮通常默认为系统设置,也许有办法解决这个问题?)。

  Current:      Desired: 

+0

请提供[最小,完整的,并且可验证示例](https://stackoverflow.com/help/mcve)。这将使我们能够协助你解决问题。没有足够的代码来重现问题。没有MCVE,它将不太可能获得您正在寻找的答案。 –

+0

对不起,我很困惑,想要制造什么问题?你能澄清一下吗? – Jake

+0

问题是你想弄清楚如何改变一个单词或包含该单词的字符串的颜色,是否正确? –

回答

1

找到了解决方案!在MenuButton中使用Menu与Tkinter创建MenuOptions的方式相同,我可以创建一个自定义的MenuOption。如果您想添加更多选项,则可以使用menbutton.configure()选项编辑按钮,并使用menbutton.menu编辑菜单项。

import Tkinter as tk  
from Tkinter import Menu, Menubutton 

class Vars(): 

    global vari 
    vari = {} 

    def GetVars(self, var): 

     return vari.get(str(var)) 

    def SendVars(self, var, val): 

     vari[str(var)] = val 


class App(): 

    def buttselect(self, link, menbutton, selectMenu): 
     var = Vars() 
     var.SendVars("Selection", link) # Store selected event 
     menbutton.configure(text=link) # Set menu text to the selected event 

    def prnt(self, link): 
     var = Vars() 

     print var.GetVars("Selection") # Print event 

    def __init__(self, selectMenu): 
     events = " " 
     options = [] 
     links = [] 
     forms = ["Yolo ","Dad? Closed","Anotha One","Normies! Closed"] #This is so you can try it for yourself 

     menbutton = Menubutton (selectMenu, text="--None Selected--", relief="raised") 
     menbutton.grid() 
     menbutton.menu = Menu (menbutton, tearoff=0) 
     menbutton["menu"] = menbutton.menu 

     #Get a list of event names 
     for x in forms: 
      info = x #Again, this is so you can try it for yourself 
      #If desired event keyword is in an event name, add it to the correct links 
      if events in info.lower(): 
       links.append(x) 

     #Remove duplicates 
     for link in range(0,len(links)): 
      options.append(links[link]) 
     list(set(options)) 

     #Final list of event names turned into menu commands 
     for link in options: 

      if "Closed" in link: 
       menbutton.menu.add_command(label= link, command= lambda link=link: self.buttselect(link, menbutton, selectMenu), foreground='red') 
      else: 
       menbutton.menu.add_command(label= link, command= lambda link=link: self.buttselect(link, menbutton, selectMenu)) 

     b = tk.Button(selectMenu, text="Selection", command= lambda link=link: self.prnt(link)) #Print selected event 
     b.pack() 

     msg = "Which one would you like to attend?" 
     label = tk.Label(selectMenu, text=msg, font="Helvedica 14") 

     label.pack(side='top', pady=10) 
     menbutton.pack(side="top", pady=10)  


selectMenu = tk.Tk() 
selectMenu.attributes('-topmost', True) 
app = App(selectMenu) 
selectMenu.mainloop() 

这导致所希望的准确的结果:

1

据为OptionMenuherehere我不认为文档有设置文本的颜色的方法。

您或许可以通过使用listBox来获得您想要的东西。有关listBox示例,请参阅文章here

+0

谢谢你尝试,我也认为listBoxs,但他们总是觉得太笨重,通常不值得牺牲极简主义定制。 – Jake

+1

你可以考虑创建你自己的OptionMenu。它可能需要一些代码,但最终你会有一个自定义的OptionMenu,能够做你设计它的任何事情:)。我必须对滚动条做同样的事情,因为你不能改变windows中tkinters滚动条的颜色。所以我做了我自己的,所以我可以。 –

+0

有趣的是,你是否只是通过自己的类来模拟Tkinter.py中的类,但使用自定义更改来做到这一点? – Jake