Skip to main content

Flake8 插件可检测(太)Tkinter 项目中的常见错误和不良做法

项目描述

flake8-tkinter

一个 flake8 插件,可帮助您检测 Tkinter 项目中的(太)常见错误和不良做法

@insolor的项目创意

安装

pip install flake8-tkinter

警告列表

常见错误

  • TK102: 不需要使用多个 mainloop 调用。一个电话就足够了。(示例
  • TK111:调用callback_handler()而不是传递单击或绑定回调的引用。(示例
  • TK112callback_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提供了相同的功能..(例如

代码质量

  • TK304add绑定方法中的值应该是布尔值。(示例

自以为是的警告

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

    • TK101: 使用多个tkinter.Tk实例。子窗口必须从tkinter.Toplevel.
    • TK103:建议重构使用.update()的代码,因为它通常没有意义,可能有害,并且被认为是代码异味。
    • TK113: 回调处理程序应该是可调用的 ( lol )
    • TK121:time.sleep()在 tkinter 代码中使用。以某种形式使用.after()
    • TK122: 在回调处理程序中使用无限循环。建议使用递归函数.after()
    • TK141:建议保留本地PhotoImage实例的引用以避免GC。
  • 跨平台(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()代替。

发展

  1. 克隆仓库
  2. 设置虚拟环境,激活并安装flake8pytest在其中
  3. 运行以可编辑格式pip install -e .安装flake8-tkinter
  4. 运行python3 -m pytest以测试您的更改

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

flake8_tkinter-0.5.4.tar.gz (11.0 kB 查看哈希

已上传 source