Форум сайта python.su
тут такая беда.делаю лабу на Tkinter,у меня в главном окне окошко canvas в котором рисуются 3 геометричекие фигуры.чтобы они рисовались я сделал три radiobutton,то есть щелкаю на одну кнопку рисуется одна фигура щелкаю на другую стирается старая и рисуется новая.потом я сделал четыре кнопки (вверх,вниз,влево,вправо) которые я расположил под canvas ,эти кнопки смещают фигуру на 2 пиксела в разные стороны.беда вот в чем ,когда я делал без radiobutton то есть просто определял канвас и присваивал переменной одну фигуру я запросто делал так чтобы нажимая на кнопки вызывалась функция которая передвигала фигуру.а тут получается так что когда я делаю radiobutton каждый раз при нажатии именно на radiobutton вызывается функция которая сверяет значиние radiobutton и рисует определенную фигуру.но переменная которой присвается определенная фигура получается локальной именно внутри функции и я никак не могу сделать так чтобы я мог этой фигурой управлять.что мне сделать.
Прикреплённый файлы: laba1.pyw (2,2 KБ)
Офлайн
как то так:
def display(): global curentfigure p=pole.create_oval(30,10,130,80) curentfigure = p def verh(event): pole.move(curentfigure,0,-2)
Офлайн
то есть вы вводите глобальную переменную.я тоже думал ввести ее ,но во первых не знал как, а во вторых начитался что глобальные переменные это прохо да и препод еще говорил что лучше без них.
большое спасибо за ответ)
Офлайн
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)
Офлайн
4kpt
А если 2 фигуры в канвасе, что найдет pole.find_all() ?
Я бы посоветовал обернуть код в класс и в качестве выделенной фигуры использовать что то типа
self._curentFigure
Но надо ли ТС влезать в дебри ООП ?
Так что в разумных пределах глобальные переменные для маленьких проектов ничего страшного.
core разработчики пока еще не выпилили global ?
Офлайн
sp3
Конечно в виде класса - совсем другое дело. Да и правильнее будет. Полностью согласен.
Но Вы не не до конца чесны :)
pole.find_all() вернет Вам набор (кортеж) из кодов всех фигур (tagId), которые нарисованы на полотне.
Если Вы хотите уточнить какая фигура нарисована по коду, то Вам необходимо всего лишь использовать метод pole.type(tagId). В этом случае программа вернет названия введенной фигуры. И вы можете управлять только отдельными из них…
Насчет глобальных переменных - не спорю. Но, как свидетельствует мой опыт, маленькие проекты потом пытаются сложить в большие (сам так делал) при этом забыв их подчистить от явных косячков (глобальных переменных в часности). Это приводит к трудноотлавливаемым ошибкам. Так, что я зарекся их использовать. Стараюсь максимально уйти от глобальных переменных или делаю БОЛЬШУЩИЕ комментарии.
P.S. Хотя это может быть моя явная манечка (или навязчивая идея, так сказать). Так что прошу не обижаться :).
Отредактировано 4kpt (Дек. 5, 2012 14:22:14)
Офлайн