Главная страница
Навигация по странице:

  • Глава Библиотека компонентов8

  • Несколько вопросов... 1. Как определить в списке, какой пункт выбран2. Как проверить, установлен ли флажок или переключа- тель...и задач

  • Пошаговая разработка программы-психолога

  • Глава Домашний психолог9

  • Приступим к диагностике

  • Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)


    Скачать 5.95 Mb.
    Название# Startwerte festlegen Red (255,0,0)
    Дата10.03.2023
    Размер5.95 Mb.
    Формат файлаpdf
    Имя файлаШуман Х. - Python для детей - 2019.pdf
    ТипДокументы
    #977830
    страница12 из 22
    1   ...   8   9   10   11   12   13   14   15   ...   22
    Глава
    Библиотека компонентов
    8
    166
    for Nr in range (0,3) :
    if ChkNum[Nr].get() == 1 :
    Text = Text + State[Nr] + " ";
    Window.title(Text)
    # Основная программа
    Window = Tk()
    Window.title("Привет!")
    Window.minsize(width=420, height=300)
    Display = Label(Window, text="Как дела?")
    Display.place(x=50, y=10)
    Links = Frame(Window, borderwidth=2, relief="sunken")
    Links.place(x=20, y=50, width=180, height=220)
    Rechts = Frame(Window, borderwidth=2, relief="raised")
    Rechts.place(x=220, y=50, width=180, height=110)
    # Вспомогательные переменные
    ChkNum = [0,0,0]
    OptNum = IntVar()
    OptNum.set(-1)
    # Опции
    Option = []
    for Nr in range(0,6) :
    Option.append(Radiobutton(Links, variable=OptNum, value=Nr, \ text=Answer[Nr]))
    Option[Nr].config(command=buttonClick)
    Option[Nr].grid(row=Nr+1, column=0, sticky="w")
    # Управление
    Choice = []
    for Nr in range(0,3) :
    ChkNum[Nr] = IntVar()
    Choice.append(Checkbutton(Rechts, variable=ChkNum[Nr], \ text= State [Nr]))
    Choice[Nr].config(command=checkClick)
    Choice[Nr].grid(row=Nr+1, column=2, sticky="w")
    # Цикл событий
    Window.mainloop()
    ¾
    Измени исходный код, сохрани файл и запусти про- грамму. Результат должен выглядеть примерно так, как показано на рис. 8.7.

    Подведение итогов
    167
    Рис. 8.7.Финальная версия программы с рамками
    Подведение итогов
    Данный раздел завершает эту главу. Потребовалось нема- ло усилий, чтобы выполнить примеры из нее, в том числе и потому, что каждый компонент имеет свои особенности, да и визуальное приукрашивание интерфейса занимает время. Вот что ты узнал:
    Frame
    Рамка (может вмещать другие компоненты)
    Listbox
    Список (многострочное поле)
    Radiobutton
    Переключатель (можно установить только в одну позицию)
    Checkbutton
    Флажок (можно установить сколько угодно, хоть все или ни одного)
    minsize()
    Определяет минимальный размер окна append()
    Добавляет элемент в список insert()
    Вставляет элемент в список
    IntVar()
    Создает переменную типа tkinter (целочисленную)
    set()
    Присваивает значение переменной tkinter get()
    Извлекает значение переменной tkinter bind()
    Связывает событие с функцией lambda=
    Вызов функции события с параметром curselection()
    Текущая выбранная запись в списке
    <>
    Событие выбора в списке variable=
    Переменная для номера или состояния в переключателе или флажке

    Глава
    Библиотека компонентов
    8
    168
    value=
    Номер пункта в группе anchor=
    Отвечает за «привязку» компонента слева или справа (pack)
    sticky()
    Отвечает за «привязку» компонента слева или справа (grid)
    relief=
    Создает рамку утопленную или выступающую
    Несколько вопросов...
    1. Как определить в списке, какой пункт выбран?
    2. Как проверить, установлен ли флажок или переключа- тель?
    ...и задач
    1. В проекте программы-гороскопа из главы 7 (horoscope1.
    py) замени отдельные кнопки списком кнопок.
    2. В этом же проекте используй компонент Listbox.
    3. Примени переключатель в том же проекте вместо кно- пок.

    169
    9
    Домашний
    психолог
    Действительно ужасно: все эти стрессы в школе и на рабо- те. Вся эта суета. Только за компьютером ты находишь пару минут отдыха – пока программа или игра не запустится.
    Как насчет терапии, которая вернет тебе равновесие и по- кой? Но зачем тратить уйму денег на психолога? Для чего ты на самом деле учишься программировать? Почему бы тебе не создать своего собственного терапевта? Он даже сможет записывать ваши разговоры в качестве бонуса.
    Итак, в этой главе ты узнаешь:
    
    какие бывают поля ввода;
    
    подробнее о списках;
    
    про ползунковые регуляторы;
    
    как загрузить и сохранить текстовые данные.
    Пошаговая разработка
    программы-психолога
    Предыдущая программа с приветствием вдохновила меня написать новое приложение, которое я хотел бы скромно назвать «домашним психологом». Первые варианты про- граммы-приветствия были не более чем приятным корот-

    Глава
    Домашний психолог
    9
    170
    ким разговором. Это то, что ты получаешь бесплатно в раз- говоре с соседями или продавщицей в магазине за углом.
    Наш новый проект должен предложить гораздо больше диаг- ностических средств. Для этого он должен сначала заиметь
    «лицо» (рис. 9.1).
    Рис. 9.1.Интерфейс программы-психолога
    Потребуется много компонентов, и необходимо увеличить окно. Давай посмотрим, что нам нужно в качестве строи- тельных материалов (табл. 9.1).
    Таблица 9.1. Компоненты для программы-психолога
    Компоненты
    Текст
    Вверху (Frame, Label, Entry)
    Ты сказал мне:
    В центре (Frame, Label, Label)
    Я говорю тебе:
    Внизу (Frame, Label, Scale)
    Диагноз:
    Button1
    Заново
    Button2
    Готово
    Заголовок
    Психолог
    В таблице есть несколько незнакомых тебе элементов, ко- торые мы добавим позже. Я начнy с трех компонентов, ко- торые мы создадим и разместим следующим образом:
    Border = []
    for pos in range(0,3) :

    Пошаговая разработка программы­психолога
    171
    Border.append(Frame(Window, borderwidth=2, relief="groove"))
    Border[pos].place(x=20, y=40+pos*90, width=460, height=50)
    Здесь я выбрал новое значение параметра relief: groove вы- деляет рамку рельефной линией. Это лучше, чем значение sunken или raised.
    Для каждого элемента управления используется метка, с помощью которой указывается, для чего он нужен. Мы также упакуем их в конструкцию for, как показано ниже:
    Display = []
    for pos in range(0,3) :
    Display.append(Label(Window, text=State[pos]))
    Display[pos].place(x=20, y=10+pos*90, width=460, height=30)
    Разумеется, список с соответствующими строками текста тоже должен быть заранее согласован:
    State = ["Ты сказал мне:", "Я говорю тебе:", "Диагноз:"]
    У нас уже есть структура приложения (рис. 9.2).
    Рис. 9.2.Структура программы готова
    Как все это будет работать? В верхней части окна ты мо- жешь ввести любой текст. Для этого нам нужно поле вво-

    Глава
    Домашний психолог
    9
    172
    да (компонент, который ты еще не знаешь). В центре, под строкой «Я говорю тебе:», должен выводиться ответ на твой вопрос. Все, что тебе нужно, – это еще одно поле вывода.
    Внизу есть возможность управлять ответом. «Диагноз:» – не что иное, как ползунковый регулятор, который меняет положение каждый раз, когда в центре появляется другой ответ. Мы доберемся до него позже.
    Сначала мы возьмем строки с ответами, которые ты уже использовал в предыдущей программе-приветствии. Поз- же разберемся, как сгенерировать больше вариантов для ответа. Теперь давай создадим остальные компоненты.
    В нижней части окна программы находятся кнопки, кото- рые также связаны с функцией события:
    Button1 = Button(Window, text="Заново", command=button1Click)
    Button1.place(x=120, y=285, width=120, height=30)
    Button2 = Button(Window, text="Готово", command=button2Click)
    Button2.place(x=260, y=285, width=120, height=30)
    Ты нажимаешь кнопку «Готово», если хочешь завершить беседу, тогда ответ должен появиться в нижнем поле. Нажа- тие кнопки «Заново» гарантирует, что все поля будут очи- щены и доступны для нового ввода/вывода.
    Перейдем к последним трем компонентам, два из которых тебе незнакомы. Начнем с блока «Ты сказал мне:»:
    Input = Entry(Border[0])
    Input.place(x=10, y=10, width=440, height=30)
    Entry
    – это поле, в которое можно ввести что-то, текст или число. Это поле ввода относится не к главному окну, а к верхней рамке (фрейму). Соответственно, позициони- рование выполняется относительно области рамки (а не всего окна программы).
    Далее размещается метка, ее ты уже знаешь. Она относится к центральной рамке (фрейму):
    Answer = Label(Border[1])
    Answer.place(x=10, y=10, width=440, height=30)
    Еще один незнакомый тебе тип – Scale – используется для изменения значения, он также называется ползунковым ре­
    гулятором.
    Его можно расположить по горизонтали или вертикали. За расположение отвечает параметр orient:

    Приступим к диагностике?
    173
    Slider = Scale(Border[2], orient="horizontal")
    Slider.config(length=430, showvalue=0)
    Slider.pack(pady=10)
    Также мы настраиваем ползунковый регулятор, опреде- ляя его длину в соответствии с окружающей рамкой. (При- ем не сработает с параметром place.) Параметр showvalue=0 предотвращает отображение значения при перемещении ползункового регулятора.
    В конце мы используем place(), следя за тем, чтобы ползун- ковый регулятор был хорошо центрирован в пределах рамки.
    Приступим к диагностике?
    Давай посмотрим весь код программы целиком (⇒ psych1.py):
    # Психолог from tkinter import *
    # Константы текста
    State = ["Ты сказал мне:", "Я говорю тебе:", "Диагноз:"]
    Diagnose = ["Это здорово!", "Это радует!", "Все возможно.", \
    "Это огорчает!", "Это плохо!", \
    "Раз ты так думаешь..."]
    # Функция для события def button1Click() :
    pass def button2Click() :
    pass
    # Основная программа
    Window = Tk()
    Window.title("Психолог")
    Window.minsize(width=500, height=330)
    # Определение состояния
    Display = []
    Border = []
    for pos in range(0,3) :
    Display.append(Label(Window, text=State[pos]))
    Display[pos].place(x=20, y=10+pos*90, width=460, height=30)
    Border.append(Frame(Window, borderwidth=2, relief="groove"))
    Border[pos].place(x=20, y=40+pos*90, width=460, height=50)
    # Ввод, ответ и ползунковый регулятор
    Input = Entry(Border[0])
    Input.place(x=10, y=10, width=440, height=30)

    Глава
    Домашний психолог
    9
    174
    Answer = Label(Border[1])
    Answer.place(x=10, y=10, width=440, height=30)
    Slider = Scale(Border[2], orient="horizontal")
    Slider.config(length=430, showvalue=0)
    Slider.pack(pady=10)
    # Кнопки "Готово" и "Заново"
    Button1 = Button(Window, text="Заново", command=button1Click)
    Button1.place(x=120, y=285, width=120, height=30)
    Button2 = Button(Window, text="Готово", command=button2Click)
    Button2.place(x=260, y=285, width=120, height=30)
    # Цикл событий
    Window.mainloop()
    ¾
    Создай новый файл и введи исходный код полностью.
    Или внеси в предыдущую программу приветствия все необходимые изменения. Затем запусти программу.
    Ты можешь ввести любой текст в поле ввода, перетаскивать ползунковый регулятор и нажимать кнопки. Ничего не произойдет: психолог, похоже, не консультирует.
    Неудивительно, потому что функция событий ни на что не способна – пока есть только один вариант передаваемого значения. Поэтому мы должны заняться решением проб- лемы. Начнем с функции button2Click(), потому что именно там происходит фактическая «консультация».
    Что именно должно произойти? После того как я введу не- кий текст и нажму кнопку «Готово», должен появиться текст ответа. Лучше всего, если случайный. Для этого нам нужен модуль, который мы уже давно не использовали:
    import random
    Если ты вставил эту строку в верхней части исходного кода, функция события может быть задействована (⇒ psych2.py):
    def button2Click() :
    Nr = random.randint(0,9)
    Antwort.config(text=Diagnose[Nr])
    Поскольку у меня есть десять записей в списке проблем, я использую код randint(0,9); если ты используешь старые записи из программы-приветствия, ты должен изменить его на randint(0,5). Также ты можешь изменить текст диаг- ностики, например так:
    Diagnose = ["Хм...", "Это важно!", \
    "Взгляни на это под другим углом!", \

    Приступим к диагностике?
    175
    "Ну что я могу сказать?", "На самом деле?", \
    "Так, все понятно.", "У тебя явно проблемы.", \
    "Как я тебя понимаю.", "У меня нет слов.", \
    "Хорошо..."]
    Если ты сейчас запустишь программу с этими изменения- ми, ты получишь ответ (который не всегда соответствует во- просу) на каждое предложение, сказанное тобой психологу.
    Теперь давай позаботимся о кнопке «Заново», позволяю- щей удалять введенный и показанный текст (⇒ psych2.py):
    def button1Click() :
    Input.delete(0,"end")
    Answer.config(text="")
    Для компонента Answer достаточно указать параметр text со значением в кавычках " " (пустым), потому что пока не ото- бражается какой-либо ответ. Для поля ввода нам нужен ме- тод delete(), поскольку в качестве параметров указывается начало и конец строки символов, которые нужно удалить.
    ("end" задается для последнего символа в строке.)
    ¾
    Добавь исходный код в свою программу, не забыв про определение двух методов событий (и, если хочешь, соб- ственные диагнозы). Затем запусти программу, введи текст и нажми кнопку «Готово» (рис. 9.3). Перед следую- щим сеансом работы сначала нажми кнопку «Заново».
    Рис. 9.3.Программа-психолог в работе

    Глава
    Домашний психолог
    9
    176
    Теперь ты, вероятно, хочешь знать, что такое ползунковый регулятор. Чем на самом деле являются элементы управле- ния «Диагноз»?
    В зависимости от положения маленького ползункового ре- гулятора в окне программы должен появиться соответст- вующий диагноз. Поскольку диагноз зависит от движения ползункового регулятора, здесь можно говорить о генера- ции. И поэтому ползунковый регулятор становится генера- тором диагнозов.
    Как привести ползунковый регулятор в действие? Пу- тем определения функции события, которая реагирует на его движение. Для этого нам нужно дополнить первые две строки кода компонента ползункового регулятора (⇒
    psych3.py).
    Slider = Scale(Border[2], orient="horizontal", command=scaleValue)
    Slider.config(from_=0, to=9, length=430, showvalue=0)
    Первая строка реализует ссылку на функцию события sca­
    leValue()
    , которую, конечно же, нам нужно определить. Во второй строке мы определяем диапазон перемещения, в моем случае, поскольку у меня десять строк текста, от 0 до 9.
    Здесь имя from_ не содержит опечатку: ключевое слово from уже есть в Python (см. строку from Tkinter import *), поэтому в этом случае его можно использовать с символом подчеркивания.
    Перейдем к функции scaleValue() (⇒ psych3.py):
    def scaleValue(event) :
    Nr = Slider.get()
    Answer.config(text=Diagnose[Nr])
    Обрати внимание, что вновь в определении должен быть указан параметр event, но его не нужно использовать при назначении command. Во-первых, значение положения ползункового регулятора определяется с помощью метода get
    . Оно используется как номер показанного диагноза.
    Измени исходный код своей программы, добавив приве- денные выше строки кода ползункового регулятора и свя- занного с ним параметра event. Затем тщательно протести- руй генератор диагнозов.

    Работа с файлами
    177
    Работа с файлами
    Если тебе больше не подходят тексты диагнозов, их можно легко изменить в любое время. Конечно, ты также можешь увеличить количество строк текстов.
    Но со временем тебе понадобится более удобный способ добавления текста в программу-психолог.
    Было бы круто написать диагнозы в текстовом редакторе и сохранить их в виде обычного текстового файла? Про- грамма соберет все строки из этого файла и поместит их в свою диагностическую базу.
    Для начала создай текстовый файл, например, с помощью программы Блокнот в операционной системе Windows.
    Если ты используешь мощный текстовый редактор, такой как Microsoft Word, ты должен сохранить файл как обычный текстовый файл (diagnose.txt). Заполни файл подходящими вариантами ответов, по одному в строку.
    Ты можешь взять текстовый файл diagnose.txt из папки с примера- ми к этой книге и использовать его. Также ты можешь отредакти- ровать его по своему усмотрению.
    Как правило, мы не знаем, сколько строк находится в таком файле, поэтому подобный список удобен в качестве гибко- го «контейнера данных». Давай для начала определим наш список диагнозов:
    Diagnose = []
    Теперь нам нужен файл, содержащий наши диагностиче- ские записи. Чтобы открыть и загрузить данные, нам ну- жен некий механизм их ввода по аналогии с информацией, вводимой с клавиатуры.
    Тебе уже знаком обычный способ «ввода/вывода данных» с по- мощью клавиатуры и монитора. Для этого мы использовали функ- цию input() для ввода с клавиатуры и функцию print() для вы- вода на экран.
    Теперь же мы имеем дело с «потоком данных»: хотя речь также идет о вводе и выводе, но уже с жесткого диска и других носи- телей.

    Глава
    Домашний психолог
    9
    178
    Я думаю, что имеет смысл разместить весь код, касаю- щийся работы с файлами, в отдельной функции, которую я определил следующим образом:
    def loadDiagnose() :
    global Max
    Nr = 0
    try :
    File = open("diagnose.txt", "r")
    for String in File :
    Diagnose.append(String.rstrip())
    Nr += 1
    Max = Nr ­ 1
    File.close()
    Для успешной работы я определил глобальную перемен- ную в верхней части исходного кода программы и присво- ил ей значение 0:
    Max = 0
    Это приводит к изменению в двух местах кода программы, где раньше у меня было число 9 (ты увидишь изменения позже в целом листинге).
    После того как мы определились с переменными Max и Nr в функции loadDiagnose, создадим объект файла:
    File = open("diagnose.txt", "r")
    Это делается с помощью функции open(), в которой пара- метры – это имя файла и режим. В данном случае исполь- зуется режим «r» – это аббревиатура от английского слова
    «read», означающая, что файл должен быть прочитан.
    Разумеется, указанный файл должен находиться в той же папке, что и программа. Либо ты можешь указать полный путь к файлу, например так:
    File = open("d:\python\projects\diagnose.txt", "r")
    или так:
    File = open("d:/python/projects/diagnose.txt", "r")

    Работа с файлами
    179
    Конечно, ты также можешь использовать другие имена папок и файлов. Важно правильно указать путь. Обрати внимание, что
    Python поддерживает как обратную косую черту (\), так и прямую
    (/). Только если файл находится в той же папке, что и проект, пол- ное имя пути указывать не требуется.
    Далее, текст из файла построчно считывается и вставляется в виде элементов в список диагнозов:
    for String in File :
    Diagnose.append(String.rstrip())
    Nr += 1
    На самом деле этого утверждения было бы достаточно:
    Diagnose.append(String)
    Дополнительный метод rstrip() гарантирует удаление лишних символов в конце сохраненной строки. Здесь это
    (невидимый) символ конца строки (если параметр не был передан в rstrip()). Если этого не сделать, каждый диагноз будет выводиться в две строки.
    Чтобы сохранить текст с диагнозами в отдельных строках, редак- тор, в котором ты вводил текст, добавляет символ, который в Py- thon можно сымитировать с помощью последовательности \n.
    Например, инструкция print("Привет!\n") возвращает еще одну
    (пустую) строку после слова «Привет!». Ты можешь не указывать метод rstrip(), но не удивляйся потом пустому пространству под текстом «Я говорю тебе:».
    Затем переменная max начинает «заполняться». Значение переменной на единицу меньше, так как отсчет начинает- ся с 0:
    Max = Nr ­ 1
    И наконец, файл закрывается, как дверка шкафа, из которо- го ты что-то достал.
    File.close()

    1   ...   8   9   10   11   12   13   14   15   ...   22


    написать администратору сайта