我正在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 *
由于tkinter
和tkinter.ttk
都有Button
小部件,所以您使用的是tkinter.ttk.Button
而不是tkinter.Button
。tkinter.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')