Может ли tkinter использовать более одной темы одновременно - PullRequest
0 голосов
/ 08 апреля 2019

Привет, может кто-нибудь сказать мне, если есть способ использовать несколько тем с tkinter.

Я пытался использовать отдельные экземпляры tk, и это вроде как работает, тема окна меняется, но виджеты, такие как кнопки и т. Д., Не реагируют на tk.StringVar (), поэтому текст или изображение не появятся в виджете.

Я пытался использовать окна верхнего уровня, но когда я меняю тему в одном окне, все окна меняются.

Я также пытался создать отдельный поток для каждого экземпляра 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 ]

2 голосов
/ 08 апреля 2019

Я не уверен, чего именно вы хотите достичь.

«Стиль» в 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()

Чтобы описать каждый шаг, я должен написать блог о стилях, но вы сами можете понять, что происходит. Я надеюсь, что это поможет вам.

0 голосов
/ 09 апреля 2019

Я решил проблему, я запускал каждый экземпляр Tk в отдельном потоке. Вместо использования потоков я использую процесс, который работает так, как я хотел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...