【问题标题】:how to maintain tkinter theme when toplevel with different theme is opened打开不同主题的顶层时如何维护 tkinter 主题
【发布时间】:2019-01-17 12:15:39
【问题描述】:

我有不同主题的 tkinter root window 和 toplevel window,但是当我打开 toplevel window 时,它会将 root window 更改为为 toplevel window 设置的主题

我想维护为每个窗口设置的主题。当我关闭顶层窗口并再次打开它时,这会导致错误_tkinter.TclError: Theme MyStyle already exists。

import tkinter as tk
import tkinter.ttk as ttk



def test2():
    rt1 = tk.Toplevel()
    rt1.geometry("500x500")

    s = ttk.Style()
    s.theme_create("MyStyle", parent="alt", settings={
    "TNotebook": {"configure": {"tabmargins": [2, 5, 2, 0]}},
    "TNotebook.Tab": {"configure": {"padding": [50, 8] }}})

    s.theme_use("MyStyle")

    notebook = ttk.Notebook(rt1)

    f1 = tk.Frame(notebook, width=200, height=200)
    f2 = tk.Frame(notebook, width=200, height=200)

    notebook.add(f1, text="tab 1")
    notebook.add(f2, text="tab 2")

    notebook.grid(row=0, column=0, sticky="nw")


root = tk.Tk()
root.geometry("500x500")


tree = ttk.Treeview(root, column=("col1", "col2"))
tree.insert("", tk.END, values=("deee", "fjfj","fjjf", "jfjfjf"))
tree.pack()

b3 = tk.Button(root, text="new", command=test2)
b3.place(x=200, y=200)


root.mainloop()

【问题讨论】:

  • "_tkinter.TclError:": Theme 只能是一个并且只能定义一次。因此,在root 上定义。更改为 "Toplevel.TNotebook": ... 以定义 not 应用范围的 style。使用ttk.Notebook(rt1, style='Toplevel.TNotebook') 应用它
  • 不明白

标签: python tkinter styles themes


【解决方案1】:

现在您正在尝试在每次按下按钮时创建一种样式,这就是导致问题的原因。

相反,只需将主题创建移动到全局命名空间,它可以在其中创建一次,这将不再是问题。

import tkinter as tk
import tkinter.ttk as ttk


def test2():
    rt1 = tk.Toplevel()
    rt1.geometry("500x500")
    notebook = ttk.Notebook(rt1)
    f1 = tk.Frame(notebook, width=200, height=200)
    f2 = tk.Frame(notebook, width=200, height=200)
    notebook.add(f1, text="tab 1")
    notebook.add(f2, text="tab 2")
    notebook.grid(row=0, column=0, sticky="nw")

root = tk.Tk()
root.geometry("500x500")
tree = ttk.Treeview(root, column=("col1", "col2"))
tree.insert("", tk.END, values=("deee", "fjfj","fjjf", "jfjfjf"))
tree.pack()

s = ttk.Style()
s.theme_create("MyStyle", parent="alt", settings={
"TNotebook": {"configure": {"tabmargins": [2, 5, 2, 0]}},
"TNotebook.Tab": {"configure": {"padding": [50, 8] }}})
s.theme_use("MyStyle")

b3 = tk.Button(root, text="new", command=test2)
b3.place(x=200, y=200)
root.mainloop()

【讨论】:

  • 我希望root window 主题与toplevel window 不同,保持默认treeview 样式。
  • ttk 风格的重点是在整个应用程序中具有一致的主题。因此,您尝试做的事情违背了 ttk 小部件的目的。如果我有时间,我会看看我是否能解决这个问题,但可能会在今天晚些时候。
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2015-04-10
  • 2020-01-26
相关资源
最近更新 更多