我最近刚拿起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()
答案 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()
请注意,将主题设置为“等值”后,只有ttk小部件变暗。因此,您需要在darkmd()
中手动更改tk小部件的颜色(就像我对root
和lb_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")
问题:如何添加主题?
首先,您必须了解,不以不受控制的方式混合 tkinter
和tkinter.ttk
小部件。 仅 tkinter.ttk
小部件可以使用theme
和style
设置样式。
仅使用以下常见的import
语句
import tkinter as tk
import tkinter.ttk as ttk
要实例化ttk
小部件,请使用:
注意:您不能在
bg=
小部件上使用ttk
!
lbl_title = ttk.Label(root, text="ToDoList")
应用范围广泛:
注意:重要是在所有小部件实例化之前一次和 进行所有样式定义。
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!