Я нахожусь в отрыве от школы, но я хочу продолжать кодирование в течение лета, поэтому я возвращаюсь к старым программам, которые я сделал, и пытаюсь их улучшить. atonofsmiles - очень простая программа Python, чтобы сделать лица на экране, которые я завершил в своем вступительном слове, в класс программирования. Несмотря на то, что это одна из моих первых программ, которые я когда-либо писал, это моя самая успешная в том, что мои дети любят ее использовать. В более ранней версии мне пришлось бы пойти в код, чтобы изменить цвет лиц, поэтому я делаю новую версию с помощью набора цветов. Он работает. , , В исходной версии getFace() находится в цикле while, чтобы постоянно прослушивать щелчок мышью. Но я бы хотел, чтобы цикл while также прослушивал мой новый getColor(), который возвращает цвет. Однако, когда я помещаю обе функции в один и тот же цикл while, я могу сделать только одно лицо за раз. Затем мне нужно снова щелкнуть панель выбора цвета, чтобы сделать другое лицо.
while True:
color = getColor()
while True:
getFace(color)
window.getMouse
main()
Мой первый инстинкт заключался в том, чтобы поместить getFace() во вложенный цикл while в первом, а цикл - так. , ,
def main():
while True:
color = getColor()
while True:
getFace(color)
window.getMouse
main()
Однако это создает ситуацию, когда я могу создавать несколько лиц, но я могу выбрать только один цвет.
Я знаю, что это не сложный вопрос, и ответ я, вероятно, очевидный для некоторых, но я не вижу его.
Полный код ниже:
#several faces
#a program to draw several faces
from graphics import *
from math import *
win1=GraphWin("Color Picker", 1000, 200)
pink=Circle(Point(100,100), 50)
pink.draw(win1)
pink.setFill("pink")
red=Circle(Point(300,100), 50)
red.draw(win1)
red.setFill("red")
blue=Circle(Point(500,100), 50)
blue.draw(win1)
blue.setFill("blue")
green=Circle(Point(700,100), 50)
green.draw(win1)
green.setFill("green")
window=GraphWin("FACE MACHINE", 1000,800)
Text(Point(200,10), 'Click to make faces.').draw(window)
Text(Point(200,25), 'One for the center of the face,').draw(window)
Text(Point(200,40), 'and the second click will determine the size of the
face.').draw(window)
Text(Point(200,55), 'Make a ton of faces').draw(window)
def drawFace(cx,cy, size, win, color):
rear=Circle(Point(cx-size,cy), .25*size)
rear.draw(window)
rear.setFill(color)
lear=Circle(Point(cx+size,cy), .25*size)
lear.draw(window)
lear.setFill(color)
head=Circle(Point(cx,cy), size)
head.draw(window)
head.setFill(color)
rightI=Circle(Point(cx+(.5*size), cy-(.5*size)), .1*size)
rightI.draw(window)
rightI.setFill('white')
rightiris=Circle(Point(cx+(.5*size), cy-(.5*size)), .05*size)
rightiris.draw(window)
rightiris.setFill('blue')
rightPupil=Circle(Point(cx+(.5*size), cy-(.5*size)), .025*size)
rightPupil.draw(window)
rightPupil.setFill('black')
leftI=Circle(Point(cx-(.5*size), cy-(.5*size)), .1*size)
leftI.draw(window)
leftI.setFill('white')
leftiris=Circle(Point(cx-(.5*size), cy-(.5*size)), .05*size)
leftiris.draw(window)
leftiris.setFill('blue')
leftPupil=Circle(Point(cx-(.5*size), cy-(.5*size)), .025*size)
leftPupil.draw(window)
leftPupil.setFill('black')
#smile=Line(Point(cx-(.5*size), cy+(.5*size)), Point(cx+(.5*size), cy+
(.5*size)))
#smile.draw(window)
bottomlip=Circle(Point(cx, cy+(.2*size)), .7*size)
bottomlip.draw(window)
bottomlip.setFill('black')
toplip=Circle(Point(cx, cy+(.15*size)), .7*size)
toplip.draw(window)
toplip.setFill(color)
toplip.setOutline(color)
rightP=Point(cx+(.02*size), cy+(.15*size))
rightP.draw(window)
leftP=Point(cx-(.02*size), cy+(.15*size))
leftP.draw(window)
def getFace(color):
pA= window.getMouse()
x1=pA.getX()
y1=pA.getY()
pB= window.getMouse()
x2=pB.getX()
y2=pB.getY()
z=sqrt((x1-x2)**2+(y1-y2)**2)
drawFace(x1,y1, z, window, color)
def getColor():
choice = win1.getMouse()
x = choice.getX()
y = choice.getY()
color = "grey"
if x > 75 and x < 125 and y > 75 and y < 125:
color = "pink"
print("pink")
return color
if x > 275 and x < 325 and y > 75 and y < 125:
color = "red"
print("red")
return color
if x > 475 and x < 525 and y > 75 and y < 125:
color = "blue"
print("blue")
return color
if x > 675 and x < 725 and y > 75 and y < 125:
color = "green"
print("green")
return color
else:
color = "grey"
print("grey")
return color
def main():
while True:
color = getColor()
while True:
getFace(color)
window.getMouse
main()
Для этого вам, вероятно, понадобится использовать привязку событий (когда произойдет событие, вызовите эту функцию). Ваш текущий код позволяет вам установить цвет один раз, а затем циклы навсегда глядя на drawFace
.
Я предполагаю, что вы используете этот класс-оболочку для Tkinter. Он нацелен на упрощение использования Tkinter, но может усложнить ситуацию, если вы попытаетесь слишком продвинуться, потому что он изменяет некоторые функции Tkinter.
Тем не менее, есть функция, встроенная в эту графическую библиотеку/класс-оболочку, которая может вызвать другую функцию в событии клика. Вы можете сделать win1.setMouseHandler(func)
где вы отправляете функцию для вызова при щелчке мышью в этом окне. Сделайте то же самое для другого окна.
Вам нужно будет передать аргумент цвета, который должен выполняться, используя один из методов, упомянутых здесь: Как передать аргумент обработчику событий в tkinter?
Вот два соответствующих метода в классе GraphWin
в этом графическом пакете:
def setMouseHandler(self, func):
self._mouseCallback = func
def _onClick(self, e):
self.mouseX = e.x
self.mouseY = e.y
if self._mouseCallback:
self._mouseCallback(Point(e.x, e.y))
Вы можете видеть, что обратный вызов отправляет текущую позицию мыши на любую функцию, которую вы передаете, и, как я уже упоминал ранее, вы вызывали функцию на объекте window: win1.setMouseHandler(func)