Почему показывается ссылка перед присвоением в python? - PullRequest
0 голосов
/ 31 марта 2020

Может кто-нибудь сказать мне, что я делаю неправильно в этой следующей 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, в Activ_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()

1 Ответ

0 голосов
/ 31 марта 2020

Разумным решением было бы использовать sth. вот так:

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 принципы! Надеюсь, что это полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...