您好,有人可以告诉我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()
答案 0 :(得分:2)
我不确定您想要实现什么目标。
tkinter中的“样式”是一个复杂的主题,应该做很多工作。
我将向您展示如何在一个窗口中使用两种不同的样式。 一个是我自己创建的,另一个是默认的。
下面是带有滚动条的示例:
#test_scrollbar_background_14_09_2014.py
from tkinter import *
from tkinter.ttk import *
def main():
app = Tk()
style = Style()
style.element_create("My.Horizontal.Scrollbar.trough", "from", "default")
style.layout("My.Horizontal.TScrollbar",
[('My.Horizontal.Scrollbar.trough', {'children':
[('Horizontal.Scrollbar.leftarrow', {'side': 'left', 'sticky': ''}),
('Horizontal.Scrollbar.rightarrow', {'side': 'right', 'sticky': ''}),
('Horizontal.Scrollbar.thumb', {'unit': '1', 'children':
[('Horizontal.Scrollbar.grip', {'sticky': ''})],
'sticky': 'nswe'})],
'sticky': 'we'})])
style.configure("My.Horizontal.TScrollbar", *style.configure("Horizontal.TScrollbar"))
style.configure("My.Horizontal.TScrollbar", troughcolor="red")
# Create and show a widget using the custom style
hs = Scrollbar(app, orient="horizontal", style="My.Horizontal.TScrollbar")
hs.place(x=5, y=5, width=150)
hs.set(0.2,0.3)
# Create and show a widget using the default style
hs2 = Scrollbar(app, orient="horizontal", style="Horizontal.TScrollbar")
hs2.place(x=5, y=150, width=150)
hs2.set(0.2,0.3)
app.mainloop()
if __name__ == '__main__':
main()
要描述每个步骤,我必须写一个有关样式的博客,但是您可以自己弄清楚发生了什么。希望对您有所帮助。
答案 1 :(得分:-1)
我解决了这个问题,我在自己的线程中运行每个Tk实例。而不是使用线程,而是使用进程,并且该进程可以按照我想要的方式工作。