Tcl错误:tkinter 中按钮的未知选项"-font"



我正在python中编写一个函数,以在tkinter中显示窗口的组件。当显示一个按钮时,我得到了这个错误:

TclError: unknown option "-font"

这是我的代码:

from tkinter import *
from tkinter.ttk import *
import socket
import psutil 
from plyer import notification 
master = Tk()
navbar = Canvas(master,width=width,highlightthickness=0, height=60, bg='#0a2145')
name = Label(master, text="Estancia", font=('Verdana',12,'italic'))
name.config(background='#0a2145', foreground='white')   
sys_det = Label(master, text='Estancia', font=('Verdana',32))
sys_det.config(background='#304566',foreground='white')
ID = Entry(master, font=('Verdana',10,'italic'), width=20)
Pass = Entry(master, font=('Verdana',10),show='•', width=20)
det_sub = Button(master, text = 'Submit',font=('Verdana',10), command=redirect, fg='white', bg='#304566', 
height=1, width=2)

canvas1.create_window(50, 22, window=name)
canvas1.create_window(680,20,window=navbar)
canvas1.create_window(685,225,window=sys_det)
canvas1.create_window(685,325,window=ID)
canvas1.create_window(685,350,window=Pass)
canvas1.create_window(685,380,window=det_sub)

有人能找出问题出在哪里吗?

问题在于如何导入模块:

from tkinter import *
from tkinter.ttk import *

由于tkintertkinter.ttk都有Button小部件,所以您使用的是tkinter.ttk.Button而不是tkinter.Buttontkinter.ttk.Button不支持font选项。

避免使用import *,使用:

import tkinter as tk
from tkinter import ttk

然后指定所需的Button,如tk.Button

这些评论描述了您的问题,但在解释您的选择或您的问题真正是什么方面,它们不够深入。您收到的错误是您真正问题的症状,而这个问题就是namespace pollution。当您from tkinter import *时,您将公开tk包的所有类。CCD_ 13具有许多与CCD_ 14重叠的类。因此,当您选择from tkinter.ttk import *时,您将覆盖tk包中的所有冗余类。

立即解决的办法是停止污染您的命名空间。你可以这样做:import tkinter as tk, tkinter.ttk as ttk。现在,当您想要使用tk小部件时,只需在类名前面加上tk别名即可。与ttk相同,但使用ttk别名。

TK示例:
label = tk.Label(self, text="some text")

TTK示例:
label = ttk.Label(self, text="some text")


解决了这个问题,你可以专注于下一部分。tk小部件希望您将选项放在类构造函数或.configure()方法中。ttk小部件希望您创建一个样式并将该样式应用于小部件。有许多语法可能性用于创建一种风格;非常简单";至";相当复杂";。如果你打算使用ttk小部件,那么你应该研究ttk.Style,并可能编写一些示例代码,这样你就可以习惯它的复杂性。不要让你没有榜样。。。

ttk样式的复杂示例。这是一个直观的例子,让你知道该期待什么。我没有复制/粘贴这个脚本的每个依赖项,因此,您不能复制/粘贴它并期望它运行。

# Scrollbar
# states ~ active disabled
# NOTE: arrowsize will change the thickness of the scrollbar even if you rip the arrows out
@dataclass
class Scrollbar_dc:
background:         String = Theme.Contrast
bordercolor:        String = Theme.Base
darkcolor:          String = Theme.Contrast
lightcolor:         String = Theme.Contrast
troughcolor:        String = Theme.Topcoat
arrowcolor:         String = Theme.Trim
gripcount:          Int = 3
arrowsize:          Int = 14
class CustomTheme(Style):
def __init__(self, basetheme='clam'):
Style.__init__(self)

self.theme_create('custom', basetheme, {
'custom.Vertical.TScrollbar': {
#this is a direct copy of the default layout
#it is intended to be a reference against the arrowless version, for comparison purposes
'layout': [('Vertical.Scrollbar.trough', 
{'sticky': 'ns', 'children': [
('Vertical.Scrollbar.uparrow', {'side': 'top', 'sticky': ''}), 
('Vertical.Scrollbar.downarrow', {'side': 'bottom', 'sticky': ''}), 
('Vertical.Scrollbar.thumb', {'expand': '1', 'sticky': 'nswe'})
]}
)],
'configure': asdict(Scrollbar_dc())
},
'custom.Horizontal.TScrollbar': {
'configure': asdict(Scrollbar_dc())
},
'arrowless.Vertical.TScrollbar': {
'layout': [('Vertical.Scrollbar.trough',
{'sticky': 'ns', 'children': [
('Vertical.Scrollbar.thumb', {'expand': '1', 'sticky': 'nswe'})
]}
)],
'configure': asdict(Scrollbar_dc()),                     # arrowsize will still size the scrollbar thickness
},
'arrowless.Horizontal.TScrollbar': {
'layout': [('Horizontal.Scrollbar.trough',
{'sticky': 'we', 'children': [
('Horizontal.Scrollbar.thumb', {'expand': '1', 'sticky': 'nswe'})
]}
)],
'configure': asdict(Scrollbar_dc())                      # arrowsize will still size the scrollbar thickness
}
})
self.theme_use('custom')

最新更新