如何添加主题?

时间:2019-02-17 07:43:37

标签: python tkinter themes ttk

我最近刚拿起python,并且正在从事一个名为“ ToDoList.py”的项目。它已经完成,但是我想添加一个按钮来使用tkinter / ttk更改GUI的主题,但没有工作。

这是错误:

Traceback (most recent call last):
  File "todolist.py", line 64, in <module>
    lbl_title = Label(root, text="ToDoList", bg="white")
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python37-32\lib\tkinter\ttk.py", line 761, in __init__
    Widget.__init__(self, master, "ttk::label", kw)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python37-32\lib\tkinter\ttk.py", line 559, in __init__
    tkinter.Widget.__init__(self, master, widgetname, kw=kw)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2296, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: unknown option "-bg"

由于我尚未调整小部件,我不明白为什么会出现此错误

from tkinter import *

from tkinter import ttk

from tkinter.ttk import *

from ttkthemes import themed_tk as tk

import random

import tkinter.messagebox

#--------root style
root = Tk()
#--------root backgroud
root.configure(bg="white")
#--------root title
root.title("Reminder")
#--------root size
root.geometry("225x300")
#--------create empty list
tasks = []
#--------fuction
def darkmd():
    root.get_themes()
    root.set_theme("equilux")
#--------command
lbl_title = Label(root, text="ToDoList", bg="white")
lbl_title.grid(row=0, column=0)

lbl_display = Label(root, text="", fg="black", bg="white")
lbl_display.grid(row=0, column=1)

txt_input = Entry(root, width=20, fg="black", bg="white")
txt_input.grid(row=1, column=1)

bt_add_task = Button(root, text="Add Task", fg="black", bg="white",         command = add_task)
bt_add_task.grid(row=1, column=0)

bt_del_all = Button(root, text="Del all", fg="black", bg="white", command = del_all)
bt_del_all.grid(row=2, column=0)

bt_del_one= Button(root, text="Del", fg="black", bg="white", command = del_one)
bt_del_one.grid(row=3, column=0)

bt_sort_asc = Button(root, text="Sort (ASC)", fg="black", bg="white", command = sort_asc)
bt_sort_asc.grid(row=4, column=0)

bt_sort_desc = Button(root, text="Sort (DESC)", fg="black", bg="white", command = sort_desc)
bt_sort_desc.grid(row=5, column=0)

bt_total_task = Button(root, text="Num Of Task", fg="black", bg="white", command = total_task)
bt_total_task.grid(row=6, column=0)

bt_darkmd = Button(root, text="Darkmode", fg="black", bg="white", command = darkmd)
bt_darkmd.grid(row=7, column=0)

lb_tasks = Listbox(root,fg="black", bg="white")
lb_tasks.grid(row=2, column=1, rowspan=9)

#--------main
root.mainloop()

3 个答案:

答案 0 :(得分:1)

作为ThemedTk的替代方法,您可以使用ThemedStyle。这样,您的代码将与使用标准ttk主题之一完全相同,只是您使用style = ThemedStyle(root)而不是style = Style(root)定义样式。然后,您只需使用style.theme_use(<theme name>)来更改主题,然后可以使用style.theme_names()列出可用的主题。

from tkinter import ttk
import tkinter as tk
from ttkthemes import ThemedStyle


#--------root style
root = tk.Tk()
#--------root backgroud
root.configure(bg="white")
#--------root title
root.title("Reminder")
#--------root size
root.geometry("225x300")

# white theme
style = ThemedStyle(root)
style.theme_use('arc')  # white style

#--------create empty list
tasks = []


#--------function
def darkmd():
    style.theme_use("equilux")  # only changes the theme of the ttk widgets
    # change style of tk widgets manually:
    bg = style.lookup('TLabel', 'background')
    fg = style.lookup('TLabel', 'foreground')
    root.configure(bg=style.lookup('TLabel', 'background'))
    lb_tasks.configure(bg=bg, fg=fg)


#--------command
lbl_title = ttk.Label(root, text="ToDoList")
lbl_title.grid(row=0, column=0)

lbl_display = ttk.Label(root, text="")
lbl_display.grid(row=0, column=1)

txt_input = ttk.Entry(root, width=20)
txt_input.grid(row=1, column=1)

bt_add_task = ttk.Button(root, text="Add Task")
bt_add_task.grid(row=1, column=0)

bt_del_all = ttk.Button(root, text="Del all")
bt_del_all.grid(row=2, column=0)

bt_del_one = ttk.Button(root, text="Del")
bt_del_one.grid(row=3, column=0)

bt_sort_asc = ttk.Button(root, text="Sort (ASC)")
bt_sort_asc.grid(row=4, column=0)

bt_sort_desc = ttk.Button(root, text="Sort (DESC)")
bt_sort_desc.grid(row=5, column=0)

bt_total_task = ttk.Button(root, text="Num Of Task")
bt_total_task.grid(row=6, column=0)

bt_darkmd = ttk.Button(root, text="Darkmode", command=darkmd)
bt_darkmd.grid(row=7, column=0)

lb_tasks = tk.Listbox(root, fg="black")
lb_tasks.grid(row=2, column=1, rowspan=9)

#--------main
root.mainloop()

清除主题:screenshot clear theme 黑暗主题:screenshot dark theme

请注意,将主题设置为“等值”后,只有ttk小部件变暗。因此,您需要在darkmd()中手动更改tk小部件的颜色(就像我对rootlb_tasks所做的那样)。

答案 1 :(得分:0)

  

评论:使用方法:ttkthemes

要使用ttkthemes,请更改以下内容:
style.theme_use(...语句,因为这在__init__(...中已经完成。

from ttkthemes import ThemedTk

class App(ThemedTk):
    def __init__(self):
        super().__init__("equilux")

        # ATTENTION!!
        # The following could fail as i couldn't test with `ThemedTk`
        # ATTENTION!!
        style = ttk.Style(self)
        style.configure("TLabel", background="white")

  

问题:如何添加主题?

首先,您必须了解,以不受控制的方式混合 tkintertkinter.ttk小部件。 tkinter.ttk小部件可以使用themestyle设置样式。


  1. 仅使用以下常见的import语句

    import tkinter as tk
    import tkinter.ttk as ttk
    
  2. 要实例化ttk小部件,请使用:

      

    注意:您不能在bg=小部件上使用ttk

    lbl_title = ttk.Label(root, text="ToDoList")
    
  3. 应用范围广泛:

      

    注意重要是在所有小部件实例化之前一次 进行所有样式定义。

    class App(tk.Tk):
        def __init__(self):
            super().__init__()
    
            style = ttk.Style(self)
            style.theme_use('clam')
            style.configure("TLabel", background="white")
    
            self.title("Tkinter Style")
            self.geometry("225x300")
    
            lbl_title = ttk.Label(self, text="ToDoList")
            lbl_title.grid(row=0, column=0)
    
    
    if __name__ == "__main__":
        App().mainloop()
    

使用Python测试:3.5

答案 2 :(得分:-1)

阅读您的评论后,我认为我的输入可能会有所帮助。

首先,确定您的操作系统。 Windows / Mac

第二,打开IDLE,然后打开IDLE首选项

您将看到设置,并在主题的单选按钮下方的“突出显示”中,看到一个下拉框,可用于将主题从IDLE Dark切换为Classic和New!