Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2012 21:33:01

datgenn
Зарегистрирован: 2012-11-05
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

передача значения переменной

тут такая беда.делаю лабу на Tkinter,у меня в главном окне окошко canvas в котором рисуются 3 геометричекие фигуры.чтобы они рисовались я сделал три radiobutton,то есть щелкаю на одну кнопку рисуется одна фигура щелкаю на другую стирается старая и рисуется новая.потом я сделал четыре кнопки (вверх,вниз,влево,вправо) которые я расположил под canvas ,эти кнопки смещают фигуру на 2 пиксела в разные стороны.беда вот в чем ,когда я делал без radiobutton то есть просто определял канвас и присваивал переменной одну фигуру я запросто делал так чтобы нажимая на кнопки вызывалась функция которая передвигала фигуру.а тут получается так что когда я делаю radiobutton каждый раз при нажатии именно на radiobutton вызывается функция которая сверяет значиние radiobutton и рисует определенную фигуру.но переменная которой присвается определенная фигура получается локальной именно внутри функции и я никак не могу сделать так чтобы я мог этой фигурой управлять.что мне сделать.

Прикреплённый файлы:
attachment laba1.pyw (2,2 KБ)

Офлайн

#2 Дек. 2, 2012 06:54:39

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

передача значения переменной

как то так:

def display():
  global curentfigure
  p=pole.create_oval(30,10,130,80)
  curentfigure = p
def verh(event):
  pole.move(curentfigure,0,-2)



Офлайн

#3 Дек. 2, 2012 09:01:16

datgenn
Зарегистрирован: 2012-11-05
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

передача значения переменной

то есть вы вводите глобальную переменную.я тоже думал ввести ее ,но во первых не знал как, а во вторых начитался что глобальные переменные это прохо да и препод еще говорил что лучше без них.
большое спасибо за ответ)

Офлайн

#4 Дек. 4, 2012 23:16:52

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

передача значения переменной

sp3
Теряем квалификацию :)
datgenn
Вы правы. Глобальные переменные не есть хорошо никогда.
Нужно исправить функции:

def verh(event):
    name_fig = pole.find_all()[0] # Узнаем кодовое имя фигуры (имя представлено в виде целого числа)
    pole.move(name_fig,0,-2)
def vniz(event):
    name_fig = pole.find_all()[0]
    pole.move(name_fig,0,2)
def left(event):
    name_fig = pole.find_all()[0]
    pole.move(name_fig,-2,0)
def right(event):
    name_fig = pole.find_all()[0]
    pole.move(name_fig,2,0)

Можно организовать движение одной функцией (вместо четырех) с использованием метода event.widget.cget(“text”), но у меня вместо слов в Вашей программе - абракадабра, посему пример показать не могу… Вы его не поймете. Выложите программу обернутую в теги. Тогда могу показать…



Офлайн

#5 Дек. 5, 2012 06:50:57

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

передача значения переменной

4kpt
А если 2 фигуры в канвасе, что найдет pole.find_all() ?
Я бы посоветовал обернуть код в класс и в качестве выделенной фигуры использовать что то типа
self._curentFigure
Но надо ли ТС влезать в дебри ООП ?
Так что в разумных пределах глобальные переменные для маленьких проектов ничего страшного.

core разработчики пока еще не выпилили global ?



Офлайн

#6 Дек. 5, 2012 14:21:13

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

передача значения переменной

sp3
Конечно в виде класса - совсем другое дело. Да и правильнее будет. Полностью согласен.
Но Вы не не до конца чесны :)
pole.find_all() вернет Вам набор (кортеж) из кодов всех фигур (tagId), которые нарисованы на полотне.
Если Вы хотите уточнить какая фигура нарисована по коду, то Вам необходимо всего лишь использовать метод pole.type(tagId). В этом случае программа вернет названия введенной фигуры. И вы можете управлять только отдельными из них…

Насчет глобальных переменных - не спорю. Но, как свидетельствует мой опыт, маленькие проекты потом пытаются сложить в большие (сам так делал) при этом забыв их подчистить от явных косячков (глобальных переменных в часности). Это приводит к трудноотлавливаемым ошибкам. Так, что я зарекся их использовать. Стараюсь максимально уйти от глобальных переменных или делаю БОЛЬШУЩИЕ комментарии.

P.S. Хотя это может быть моя явная манечка (или навязчивая идея, так сказать). Так что прошу не обижаться :).



Отредактировано 4kpt (Дек. 5, 2012 14:22:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version