【问题标题】:Can tkinter use more than one theme at a timetkinter 一次可以使用多个主题吗
【发布时间】: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

标签: python tkinter themes


【解决方案1】:

我不确定你想要实现什么。

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()

为了描述每个步骤,我必须写一篇关于 Styles 的博客,但你可以自己弄清楚发生了什么。希望对你有帮助。

【讨论】:

    【解决方案2】:

    我解决了这个问题,我在它自己的线程中运行每个 Tk 实例。我没有使用线程,而是使用了一个进程,这正是我想要的。

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 2014-06-16
      • 2013-06-09
      • 1970-01-01
      • 2021-09-28
      • 2014-01-11
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多