python - 为什么它在 python 分配之前显示引用?
问题描述
谁能告诉我在下面的 Python 程序中我做错了什么?
我正在尝试创建类似 Paint 的应用程序,但它显示错误。
文件“E:\project\New folder\paint_new.py”,第 33 行,在 use_eraser
activate_button(eraser_button, eraser_mode=True)
文件“E:\project\New folder\paint_new.py”,第 36 行,在 activate_button 中
active_button.config(relief=RAISED)
UnboundLocalError:分配前引用的局部变量“active_button”
名称“eraser_on”未定义
from tkinter import *
from tkinter.colorchooser import askcolor
import tkinter as tk
DEFAULT_PEN_SIZE = 5.0
DEFAULT_COLOR = 'black'
def setup():
old_x = None
old_y = None
line_width = choose_size_button.get()
color = DEFAULT_COLOR
eraser_on = False
active_button = pen_button
c.bind('<B1-Motion>', paint)
c.bind('<ButtonRelease-1>', reset)
def use_pen():
activate_button(pen_button)
def use_brush():
activate_button(brush_button)
def choose_color():
eraser_on = False
color = askcolor(color=color)[1]
def use_eraser():
activate_button(eraser_button, eraser_mode=True)
def activate_button(some_button, eraser_mode=False):
active_button.config(relief=RAISED)
some_button.config(relief=SUNKEN)
active_button = some_button
eraser_on = eraser_mode
def paint(event):
line_width = choose_size_button.get()
paint_color = 'white' if eraser_on else color
if old_x and old_y:
c.create_line(old_x, old_y, event.x, event.y,
width=line_width, fill=paint_color,
capstyle=ROUND, smooth=TRUE, splinesteps=36)
old_x = event.x
old_y = event.y
def reset(event):
old_x, old_y = None, None
root = tk.Tk()
pen_button = Button(root, text='pen', command=use_pen)
pen_button.grid(row=0, column=0)
brush_button = Button(root, text='brush', command=use_brush)
brush_button.grid(row=0, column=1)
color_button = Button(root, text='color', command=choose_color)
color_button.grid(row=0, column=2)
eraser_button = Button(root, text='eraser', command=use_eraser)
eraser_button.grid(row=0, column=3)
choose_size_button = Scale(root, from_=1, to=10, orient=HORIZONTAL)
choose_size_button.grid(row=0, column=4)
c = Canvas(root, bg='white', width=600, height=600)
c.grid(row=1, columnspan=5)
setup()
root.mainloop()
解决方案
聪明的解决方案是使用某物。像这样:
from tkinter import *
from tkinter.colorchooser import askcolor
import tkinter as tk
DEFAULT_PEN_SIZE = 5.0
DEFAULT_COLOR = 'black'
class ABC:
def setup(self):
self.old_x = None
self.old_y = None
self.line_width = self.choose_size_button.get()
self.color = DEFAULT_COLOR
self.eraser_on = False
self.active_button = self.pen_button
self.c.bind('<B1-Motion>', self.paint)
self.c.bind('<ButtonRelease-1>', self.reset)
def use_pen(self):
self.activate_button(self.pen_button)
def use_brush(self):
self.activate_button(self.brush_button)
def choose_color(self):
self.eraser_on = False
self.color = askcolor(color=self.color)[1]
def use_eraser(self):
self.activate_button(self.eraser_button, eraser_mode=True)
def activate_button(self, some_button, eraser_mode=False):
self.active_button.config(relief=RAISED)
some_button.config(relief=SUNKEN)
self.active_button = some_button
self.eraser_on = eraser_mode
def paint(self, event):
self.line_width = self.choose_size_button.get()
self.paint_color = 'white' if self.eraser_on else self.color
if self.old_x and self.old_y:
self.c.create_line(self.old_x, self.old_y, event.x, event.y,
width=self.line_width, fill=self.paint_color,
capstyle=ROUND, smooth=TRUE, splinesteps=36)
self.old_x = event.x
self.old_y = event.y
def reset(self, event):
self.old_x, self.old_y = None, None
def __init__(self):
self.root = tk.Tk()
self.pen_button = Button(self.root, text='pen', command=self.use_pen)
self.pen_button.grid(row=0, column=0)
self.brush_button = Button(self.root, text='brush', command=self.use_brush)
self.brush_button.grid(row=0, column=1)
self.color_button = Button(self.root, text='color', command=self.choose_color)
self.color_button.grid(row=0, column=2)
self.eraser_button = Button(self.root, text='eraser', command=self.use_eraser)
self.eraser_button.grid(row=0, column=3)
self.choose_size_button = Scale(self.root, from_=1, to=10, orient=HORIZONTAL)
self.choose_size_button.grid(row=0, column=4)
self.c = Canvas(self.root, bg='white', width=600, height=600)
self.c.grid(row=1, columnspan=5)
self.setup()
self.root.mainloop()
ABC()
学习简单的 OOP 原则!希望这会有所帮助!
推荐阅读
- aem - 在 AEM 6.3 CFP2 中,更改/删除的属性不再冒泡吗?
- vba - Vlookup 语法和 MsgBox 错误
- ajax - 授权标头不适用于 cors
- python - 将 JSONL 文件加载为 JSON 对象
- python - 使用 `numpy.vectorize` 创建多维数组会导致 ValueError: setting an array element with a sequence
- php - 无法使用 PDO 准备好的语句找到错误
- angular - Angular - SheetJS - 如何将 HTML 表格导出到 Excel?
- node.js - Postgres 和 Node 之间的加密/解密
- desktop-bridge - 用于桌面桥的带有 CefGlue 子进程的 Net Core 应用程序
- javascript - 如果浏览器选项卡处于活动状态,如何更改 Shopify 标题