Как реализовать вложенные циклы while в Python

1

Я нахожусь в отрыве от школы, но я хочу продолжать кодирование в течение лета, поэтому я возвращаюсь к старым программам, которые я сделал, и пытаюсь их улучшить. 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()
Теги:
while-loop

1 ответ

0

Для этого вам, вероятно, понадобится использовать привязку событий (когда произойдет событие, вызовите эту функцию). Ваш текущий код позволяет вам установить цвет один раз, а затем циклы навсегда глядя на 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)

  • 0
    Спасибо. Да, это тот же файл graphics.py, который я использую. Причина использования getMouse () состояла в том, чтобы получить доступ к координатам x и y щелчков мышью по щелчку мыши, чтобы определить, какой цвет нажимался. Когда я жестко закодировал эти «кнопки», я задумался, а есть ли лучший способ. Не совсем помню функцию Button (), которую я использовал в других программах на Python. Я предполагаю, что это будет работать лучше, чем примитивные кнопки, которые я создал. Позволит ли win1.setMouseHandler (func) определить, где в окне была нажата мышь или была нажата конкретная кнопка?
  • 0
    Да, вы бы сделали отдельный setMouseHandler для каждого окна, и я отредактировал свой ответ, чтобы показать соответствующие функции, и что вход для обратного вызова - это расположение мыши.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню