可以一次使用多个主题

时间:2019-04-08 16:46:39

标签: python tkinter themes

您好,有人可以告诉我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()

2 个答案:

答案 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实例。而不是使用线程,而是使用进程,并且该进程可以按照我想要的方式工作。