Как стать автором
Обновить

Комментарии 27

Студенты еще спросили, а можно ли запускать это как заставку на рабочем столе Windows? Пока не нашла как это можно было бы сделать.

Это же обычные программы, которые обычно запускаются на полный экран, ни и предусматривают выход при нажатии на клавиши и пр:

from Tkinter import *

root=Tk()
root.overrideredirect(1) # убираем заголовок окна
root.state('zoomed')  # разворачиваем на весь экран

def exit(event):root.destroy()

Label(root,text='Hello world').place(relx=0.5,rely=0.5,anchor=CENTER)


root.bind('<Button-1>',exit) # сюда еще можно добавить события нажатия на клавиши

root.mainloop()




Остается собрать с помощью py2exe и поменять расширение с EXE на SCR
kAIST Спасибо за совет и код. Надо будет попробовать.
Изменить строчки выбора позиции круга.

x0 = randint(-size/10, size)
y0 = randint(-size/10, size)

Таким образом круги будут вылезать слева и сверху. И пустоты не будет оставаться.
art1415926535 отлично. Спасибо за идею. Я пробовала вместо 0 написать -3 — особо разницы не увидела, потому отказалась от этого. А до -size/10 не додумалась ;)
А еще лучше координаты круга указать так:
canvas.create_oval(x-d/2, y-d/2, x+d/2, y+d/2, fill=colors)

canvas.create_oval(...) овал рисует по координатам левого верхнего и правого нижнего угла описанного прямоугольника
image
http://www.python-course.eu/tkinter_canvas.php

P.S. и для d = randint(0, size/5) ноль лучше на какое-то число запустить (иначе получим круг нулевого диаметра)
P.S. и для d = randint(0, size/5) ноль лучше на какое-то число запустить (иначе получим круг нулевого диаметра)

Ну да, логично, спасибо
В работе со студентами и учениками я заметила, что при изучении какого-либо языка программирования большой интерес вызывает работа с графикой. Даже те студенты, которые скучали на заданиях про числа Фибоначчи, и уже казалось бы у них пропадал интерес к изучению языка, активизировались на темах, связанных с графикой.


У меня примерно так было.
Когда долгое время перед глазами графические интерфейсы, а сам не представляешь себе их внутреннего устройства, они кажутся магией. Открывая своё первое окно с помощью какого-нибудь API, будто посвящаешься в тайну, которая раньше тебе была недоступна. Отчего-то приложение с окном кажется более «реальным», чем прочие. Вероятно, это следствие повсеместного распространения Windows и невозможности представить себе какие-то иные приложения/программы. Консольные helloworld'ы кажутся непонятными и странными поделками.

Успехов в начинаниях! Попробуйте посмотреть PyGame и PyGame Zero — обычно, создание игрушек ещё больше увлекает.
www.pygame.org/docs/tut/newbieguide.html
pygame-zero.readthedocs.org/en/latest
JIghtuse Про PyGame чиала, но пока не вникала, а про PyGame Zero и не слышала. Спасибо, покопаюсь.
На одной конференции писали ради забавы похожий код(код потерялся вместе с буком).
image
Из интересного цвета можно выбирать из палитры, а палитру взять уже готовую, тогда картинка будет смотреться целостнее, что ли (например flat ui).
ice2heart тоже думала о том, что можно не только кружочки рисовать. На счет flat ui нашла такое flatuicolors.com. Оно?
Да оно, там просто все цвета между собой сочетаются. Можно оттуда взять значение цветов, сложить в лист и брать случайный элемент.
Небольшое замечание к первому примеру. Вот сдесь пропущен импорт:
from tkinter import *
window = Tk()
colorchooser.askcolor()


Нужно добавить:
from tkinter import colorchooser


Зачем? Мне кажется, что звездочки вполне достаточно, ведь нужен не только colorchooser, а и другие команды
Звездочка импортирует не все:
In [1]: from tkinter import *

In [2]: colorchooser.askcolor()                                                                     
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-f2db2b9f793a> in <module>()
----> 1 colorchooser.askcolor()

NameError: name 'colorchooser' is not defined

In [3]: from tkinter import colorchooser

In [4]: colorchooser.askcolor()
Out[4]: (None, None)


Почему так?
Код
from tkinter import *

импортирует классы, заданные в
/usr/lib/python3.4/tkinter/__init__.py


Tk там есть, а colorchooser — нет. Отсюда и ошибка.
Понятно, спасибо. Отвечу как двоечник — но работает же :) И у меня такой ошибки не возникает
Вот у меня возникла, поэтому и разобрался. Возможно, он был импортирован где-то ранее в коде, вот и работало. Я тестировал в интерактивной консоли Python 3.4 и 3.5.
Возможно, он был импортирован где-то ранее в коде, вот и работало

нет, не был
Я делала в IDLE Python 3.5.

В общем понятно, что нюанс такой может быть…
У меня, кстати, получались ошибки, если я писала просто — import tkinter
Если просто import tkinter, то в консоли появлялся объект-модуль «tkinter», и обращаться к его содержимому (к объявленным там классам, функциям и переменным) нужно с префиксом: window = tkinter.Tk(). Но colorchooser всё равно придётся импортировать отдельно: import tkinter.colorchooser и потом tkinter.colorchooser.askcolor() и так далее. А поскольку window вы таким образом объявляете уже в своём модуле, у него префикса не будет, его методы будут доступны непосредственно — например, window.state('zoomed') для разворачивания окна.

Если написать from tkinter import *, colorchooser не импортируется — посмотрите сами, dir() его не покажет.
О, а ведь и верно, если использовать idle, после from tkinter import * мы видим, что colorchooser в dir() есть.

В любом случае, не рассчитывайте на это поведение. Это вероятнее всего баг idle, а не фича. В скриптах, запускаемых не через idle (c «шабангом» первой строкой вида #!/usr/bin/env python3, либо командой python script.py) это работать не будет.

И не стоит писать «from XXX import *» — это дурной тон. Можно нарваться на одинаковые идентификаторы в нескольких модулях. Лучше импортировать либо только то, что вы действительно будете использовать — в данном случае, примерно так: from tkinter import colorchooser, Tk
В любом случае, не рассчитывайте на это поведение. Это вероятнее всего баг idle, а не фича.

:))
А где лучше тогда проверять правильность кода?
Пишете в командной строке python или запускаете python.exe без параметров. Открывается интерактивная консоль, наподобие той, что в idle, но без всяких обрамлений. Вот поскольку непосредственно этот интерпретатор (python или python.exe) и будет выполнять вашу программу в подавляющем большинстве случаев, на её поведение можно ориентироваться.

А готовый скрипт запускать так: python(.exe) путь-к-скрипту.py
Собственно, так софт на python и работает, не через idle же запускается.

Как вариант для обучения/разработки — использовать ipython. У него удобные «консоли» и «ноутбуки», вроде этого. Не встречал в нём какого-то особого поведения, как в idle.
Собственно, так софт на python и работает, не через idle же запускается.

Я сказал «в подавляющем большинстве», потому, что иногда интерпретатор — всё же не /usr/bin/python, а встроен в приложение-хост. Например, в виде плагина uwsgi, или плагина xchat, и так далее.
Таки думала, что вы это скажете :)
Ясно. Но не очень удобно, зато надежно.
На счет ошибки — вероятно, еще одна особенность IDLE (в дополнение к тому, что описал merlin-vrn в своих комментариях). В обычной консоли все отлично, модуль импортируется:
$ python3.5
Python 3.5.0 (default, Nov  1 2015, 16:18:53) 
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>> tkinter
<module 'tkinter' from '/usr/lib64/python3.5/tkinter/__init__.py'>
>>> 

Осталось только обращаться к содержимому правильно :)
а у меня canvas.create_oval кушает память и после рисования кружочка не отдаёт её обратно. И с каждым новым кружочком памяти всё меньше…
Есть ли в python способ рисования без создания объектов?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории