Flake8 插件可检测(太)Tkinter 项目中的常见错误和不良做法
项目描述
flake8-tkinter
一个 flake8 插件,可帮助您检测 Tkinter 项目中的(太)常见错误和不良做法
@insolor的项目创意
安装
pip install flake8-tkinter
警告列表
常见错误
TK102: 不需要使用多个 mainloop 调用。一个电话就足够了。(示例)TK111:调用callback_handler()而不是传递单击或绑定回调的引用。(示例)TK112:callback_handler()使用参数调用而不是传递单击或绑定回调的引用。如果您需要callback_handler使用参数调用,请使用 lambda 或 functools.partial。(示例)TK131:将几何管理器调用的结果分配给变量。(示例)
最佳实践
TK201: 使用from tkinter import *通常是一种不好的做法,不鼓励使用。使用import tkinter as tk或简单地import tkinter代替。(示例)TK202: 使用from tkinter.ttk import *通常是一种不好的做法,不鼓励使用。改为使用from tkinter import ttk。(示例)TK211: 使用import tkinter.ttk as ttk是没有意义的。改为使用from tkinter import ttk。(示例)TK221: 使用 tkinter.TRUE、tkinter.FALSE 等是没有意义的。请改用适当的 Python 布尔值。(示例)TK231:使用 bind withoutadd=True将覆盖此小部件上此序列的任何现有绑定。要么明确地覆盖它们,add=False要么使用add=True来保留现有的绑定。(示例)TK232: 在循环中创建标签绑定会导致内存泄漏。将返回的命令名称存储在列表中以便稍后清理它们。(示例)TK251:使用tkinter.Message小部件。这是多余的,因为tkinter.Label提供了相同的功能..(例如
代码质量
TK304:add绑定方法中的值应该是布尔值。(示例)
自以为是的警告
TK504: 使用 tkinter 常量。改用字符串文字(默认情况下禁用)。(示例)
例子
TK102
# Bad
def foo():
top = tk.Toplevel()
...
top.mainloop()
root.mainloop()
# Good
def foo():
top = tk.Toplevel()
...
root.mainloop()
TK111
# Bad
tk.Button(..., command=foo())
button.config(command=bar())
button.bind("<Button-3>", baz())
# Good
tk.Button(..., command=foo)
button.config(command=bar)
button.bind("<Button-3>", baz)
TK112
# Bad
tk.Button(..., command=foo(arg, kwarg=...))
button.config(command=bar(arg, kwarg=...))
button.bind("<Button-3>", baz(arg, kwarg=...))
# Good
tk.Button(..., command=lambda: foo(arg, kwarg=...))
button.config(command=lambda: bar(arg, kwarg=...))
button.bind("<Button-3>", lambda e: baz(arg, kwarg=...))
TK131
# Bad
btn = tk.Button().grid()
# Good
btn = tk.Button()
btn.grid()
TK201
# Bad
from tkinter import *
# Good
import tkinter
# OR
import tkinter as tk
TK202
# Bad
from tkinter.ttk import *
# Good
from tkinter import ttk
TK211
# Bad
import tkinter.ttk as ttk
# Good
from tkinter import ttk
TK221
# Bad
w.pack(expand=tk.TRUE)
w.pack(expand=tk.FALSE)
w.pack(expand=tk.YES)
w.pack(expand=tk.NO)
w.pack(expand=tk.ON)
w.pack(expand=tk.OFF)
# Good
w.pack(expand=True)
w.pack(expand=False)
TK231
将在 v1.0.0 中更名为 TK141
# Bad
w.bind("<Button-1>", foo)
# Good
w.bind("<Button-1>", foo, add=True)
# OR
w.bind("<Button-1>", foo, add=False)
TK232
将在 v1.0.0 中重命名为 TK142
# Bad
for index, foo in enumerate(foos):
w.tag_bind(f"bar_{index}", "<Button-1>", baz)
# Good
for index, foo in enumerate(foos):
tcl_command = w.tag_bind(f"bar_{index}", "<Button-1>", baz)
bindings.append(tcl_command) # Clean them up later with `.deletecommand()`
TK251
是的,文本换行差异有一些细微差别,但可以调整
# Bad
w = tkinter.Message()
# Good
w = tkinter.Label()
TK304
# Bad
w.bind("<Button-1>", foo, add="+")
# Good
w.bind("<Button-1>", foo, add=True)
TK504
# Bad
w.pack(side=tkinter.BOTTOM, fill=tkinter.BOTH)
# Good
w.pack(side="bottom", fill="both")
计划中的警告
-
常见错误 (TK101-TK179)
-
跨平台(TK181-TK199)
TK181: 使用<Shift-Tab>绑定。它在 Linux 上不起作用。
-
最佳实践 (TK201-TK299)
TK222: 这样的使用tk.N+tk.S+tk.E+tk.W和组合。改用tk.NSEW, 或其他常量。TK241:创建一个没有指定父级的小部件,并且在同一范围内有一个容器。TK261: 使用后续wm_attributes调用。它可以采用值对。
-
代码质量(TK301-TK399)
TK301: 建议使用更清晰的绑定顺序,比如<Button-1>代替<1>和<Key-a>代替<a>。TK302: 建议使用更清晰的tkinter.Text索引,比如end - 1 chars代替end-1c.TK303: 使用浮点数作为tkinter.Text索引。它之所以有效,是因为 Tkinter 如何将 Python 对象转换为 Tcl,但它不应该。
-
OO (TK401-TK499)
TK401:考虑使用 OOP 重构一个巨大的应用程序。TK402:考虑将小部件重构为单独的类。
-
意见规则(TK501-TK599)
TK501: 调用mainloop()根窗口以外的东西。TK502: 使用类似的东西root.wm_title()。使用root.title(). (但应该有例外,比如wm_attributes)TK503: 对小部件 cget 和配置使用下标。使用.cget()and.configure()代替。
发展
- 克隆仓库
- 设置虚拟环境,激活并安装
flake8并pytest在其中 - 运行以可编辑格式
pip install -e .安装flake8-tkinter - 运行
python3 -m pytest以测试您的更改
项目详情
关
flake8_tkinter -0.5.4.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 25cdd42d1fe9a081326e2da5503e05b35b81901d3f29a31028d51308116d8505 |
|
| MD5 | b88d945eb1c944a588f416d336553b4f |
|
| 布莱克2-256 | b7b6c1ea14532a22d54e05aea1ffb5769b0bc8b5f60111394edcbb6699587caa |