Найти - Пользователи
Полная версия: передача значения переменной
Начало » GUI » передача значения переменной
1
datgenn
тут такая беда.делаю лабу на Tkinter,у меня в главном окне окошко canvas в котором рисуются 3 геометричекие фигуры.чтобы они рисовались я сделал три radiobutton,то есть щелкаю на одну кнопку рисуется одна фигура щелкаю на другую стирается старая и рисуется новая.потом я сделал четыре кнопки (вверх,вниз,влево,вправо) которые я расположил под canvas ,эти кнопки смещают фигуру на 2 пиксела в разные стороны.беда вот в чем ,когда я делал без radiobutton то есть просто определял канвас и присваивал переменной одну фигуру я запросто делал так чтобы нажимая на кнопки вызывалась функция которая передвигала фигуру.а тут получается так что когда я делаю radiobutton каждый раз при нажатии именно на radiobutton вызывается функция которая сверяет значиние radiobutton и рисует определенную фигуру.но переменная которой присвается определенная фигура получается локальной именно внутри функции и я никак не могу сделать так чтобы я мог этой фигурой управлять.что мне сделать.
sp3
как то так:
def display():
  global curentfigure
  p=pole.create_oval(30,10,130,80)
  curentfigure = p
def verh(event):
  pole.move(curentfigure,0,-2)
datgenn
то есть вы вводите глобальную переменную.я тоже думал ввести ее ,но во первых не знал как, а во вторых начитался что глобальные переменные это прохо да и препод еще говорил что лучше без них.
большое спасибо за ответ)
4kpt
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”), но у меня вместо слов в Вашей программе - абракадабра, посему пример показать не могу… Вы его не поймете. Выложите программу обернутую в теги. Тогда могу показать…
sp3
4kpt
А если 2 фигуры в канвасе, что найдет pole.find_all() ?
Я бы посоветовал обернуть код в класс и в качестве выделенной фигуры использовать что то типа
self._curentFigure
Но надо ли ТС влезать в дебри ООП ?
Так что в разумных пределах глобальные переменные для маленьких проектов ничего страшного.

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

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

P.S. Хотя это может быть моя явная манечка (или навязчивая идея, так сказать). Так что прошу не обижаться :).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB