【发布时间】:2019-04-08 16:46:38
【问题描述】:
您好,谁能告诉我是否有办法在 tkinter 中使用多个主题。
我尝试过使用单独的 tk 实例,它可以工作,窗口主题发生变化,但按钮等小部件不响应 tk.StringVar(),因此小部件中不会出现任何文本或图像。
我曾尝试使用 Topplevel 窗口,但是当我在一个窗口中更改主题时,所有窗口都会更改。
我也尝试为每个 Tk 实例创建一个单独的线程,但这也不起作用。
我想知道一次可以使用多个主题。
下面的代码是创建窗口的基本代码,所有的窗口都会使用 类似的代码。
import json
import tkinter as tk
import tkinter.ttk as ttk
from zmq import Context
from zmq.backend.cython.constants import REQ
from tkbuilder.constants import REGISTER
class Client(tk.Tk):
def __init__(self):
super().__init__()
self.id = id(self)
self.cxt = Context()
self.sock = self.cxt.socket(REQ)
if self.sock:
self.sock.connect("tcp://localhost:5555")
def register(self):
req = json.dumps({
'id': self.id,
'req': REGISTER,
})
self.sock.send_string(req)
req = json.loads(self.sock.recv())
if req.get('auth'):
win = self
self.var = tk.StringVar()
self.var.set(str(self.id))
self.style = ttk.Style(win)
self.style.theme_use('classic')
win.title('User Login')
btn = ttk.Button(win)
btn.config(textvariable=self.var)
btn.grid()
ent = ttk.Entry(win)
ent.config(textvariable=self.var)
ent.grid()
win.mainloop()
【问题讨论】:
-
你知道有什么程序可以同时运行两个主题吗?
-
您是在一个脚本中还是在两个单独的脚本中创建了单独的实例?当您在一个脚本中创建两个
Tk()时,它们不会被隔离,并且它们可能与StringVar()有问题,但如果您运行两个脚本,那么系统会隔离它们并且它们不应该与StringVar有问题 -
您可以使用 ttk syles 构建可自定义的主题,或者为常规 tk 小部件生成您自己的主题。这只是很多工作。
-
可能使用
ttk可以为不同的窗口/子窗口创建不同的样式。 -
@DanielHuckson 如果没有一些代码示例,我们无法帮助您。就目前而言,我确信您可以使用我最近提到的两种方法来构建自定义主题。请提供Minimal Complete and Verifiable Example。