Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 10, 2022 11:28:00

dement3r
Зарегистрирован: 2022-11-09
Сообщения: 8
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

xam1816
Не знаю, правильно ли я вас понял или нет, но вот то что получилось:

 import tkinter as tk
root = tk.Tk()
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
w = w // 2
h = h // 2
w = w - 200
h = h - 200
root.geometry('400x400+{}+{}'.format(w, h))
root.title("Главное окно")
e = tk.Entry(root)
e.pack()
e.insert(0,"Введите текст") 
c = tk.Entry(root) 
c.pack()
c.insert(0,"Ответ")
b = tk.Button(root, text = "Узнать, панграм ли это",)
b.pack()
root.mainloop()

Офлайн

#2 Ноя. 10, 2022 14:45:19

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

анализируйте:

 from tkinter import *
root = Tk()
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
w = w // 2
h = h // 2
w = w - 200
h = h - 200
root.geometry('400x400+{}+{}'.format(w, h))
root.title("Панграмм")
e = Entry(root, width = 50)
e.pack()
def is_pangram():
    c = e.get()
    if c in 'abcdefghijklmnopqrstuvwxyz':
        True
        print("да")
    else:
        False
        print("нет")
b = Button(root, text="Узнать панаграмм", command = is_pangram); b.pack()
root.mainloop()

Офлайн

#3 Ноя. 10, 2022 15:04:13

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

dement3r
Не знаю, правильно ли я вас понял или нет,
Теперь у тебя есть место входа информации и место выхода.
Когда ты нажимаешь на кнопку - это тоже входящая информация от тебя - сигнал для вызова функции.
Функция в свою очередь - это такая же программа. У нее тоже есть информация на входе - это сам сигнал вызова и информация в виде аргументов которые ты ей передаешь.

Так вот создай сейчас функцию отдельно от всего твоего кода, которая принимает на вход аргумент(объект_откуда_берется_текст) -> далее внутри функции идет обработка этой информации, в твоем случае тебе нужно чтобы этот объект_откуда_берется_текст вернул то что в нем написано, из документации ты знаешь что он это делает это с помощью своего метода get().
text = объект_откуда_берется_текст.get()
-> далее идет выход информации
return text
вход -> обработка -> выход

объект_откуда_берется_текст -> алгоритм работы с этим объектом -> текст.

кому дальше передать этот текст? следующей программе - функции - вид которой:

(объект_который_показывает_текст, текст_для вывода) -> алгоритм работы с этой информацией -> None(нулевая информация тоже информация)

внутри этой функции будешь описывать алгоритм вывода на экран.

напиши код этих двух функций сюда

Офлайн

#4 Ноя. 10, 2022 17:37:44

dement3r
Зарегистрирован: 2022-11-09
Сообщения: 8
Репутация: +  1  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

xam1816
Не знаю, примерно думаю, что должно быть вот так, и то это было сделано с помощью моего преподавателя
Мне нужно было чтобы мой текст выводился в лейбле, но я совсем забыл или даже скорее не знал, что нужно писать e.get(), чтобы информация бралась из него, только сегодня на паре понял это. Вы очень помогли мне, спасибо большое, долгих вам лет жизни)

 def f():
    ggg = e.get()
    alf = 'abcdefghijklmnopqrstuvwxyz'
    for text in alf:
        if not in ggg:
            l['text'] = 'False'
            return
            l['text'] = 'True'

Отредактировано dement3r (Ноя. 10, 2022 17:38:11)

Офлайн

#5 Ноя. 10, 2022 23:35:17

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

xam1816
объект_откуда_берется_текст -> алгоритм работы с этим объектом -> текст.
  
def get_text_from_entry(entry):
    text = entry.get()
    return text

xam1816
(объект_который_показывает_текст, текст_для вывода) -> алгоритм работы с этой информацией -> None(нулевая информация тоже информация)

  
def show_text_in_entry(entry, text):
    entry.delete(0, 'end')
    entry.insert(0, text)

в следующей функции я их объединяю

  
def process(input_obj, out_obj):
    text = get_text_from_entry(input_obj)
    show_text_in_entry(out_obj, text)

эти функции живут сами по себе, им все-равно на твое окно и вообще на твою программу.

далее привязываем сигнал с кнопки, вызвать функцию, которая вызовет функцию process(e, c) - где e и с соответственно объекты tkinter.Entry.

  
b = tk.Button(root, text = "Узнать, панграмм ли это", command=lambda: process(e, c))

вот основа программы, получить что-то на вход, и выдать что-то на выход. В данном случае это информация со входа без изменения идет на выход

теперь нужна функция
текст -> алгоритм определения панграмм -> True/False
  
def is_pangramm(text):
    RU_ALPHABET = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    for i in RU_ALPHABET:
        if text.find(i) == -1:
            return False
    return True

теперь я могу в зависимости от информации True/False в функции process изменить какую информацию вывести на выход
  
def process(input_obj, out_obj):
    text = get_text_from_entry(input_obj)
    answer = is_pangramm(text)
    answers = {True: 'is_pangramm',
               False: 'not_pangramm'}
    show_text_in_entry(out_obj, answers[answer])

весь код
  
import tkinter as tk
 
def get_text_from_entry(entry):
    text = entry.get()
    return text
 
def show_text_in_entry(entry, text):
    entry.delete(0, 'end')
    entry.insert(0, text)
 
def process(input_obj, out_obj):
    text = get_text_from_entry(input_obj)
    answer = is_pangramm(text)
    answers = {True: 'is_pangramm',
               False: 'not_pangramm'}
    show_text_in_entry(out_obj, answers[answer])
 
def is_pangramm(text):
    RU_ALPHABET = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    for i in RU_ALPHABET:
        if text.find(i) == -1:
            return False
    return True
 
root = tk.Tk()
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
w = w // 2
h = h // 2
w = w - 200
h = h - 200
root.geometry('400x400+{}+{}'.format(w, h))
root.title("Главное окно")
e = tk.Entry(root)
e.pack()
c = tk.Entry(root)
c.pack()
c.insert(0,"Ответ")
b = tk.Button(root, text = "Узнать, панграм ли это", command=lambda: process(e, c))
b.pack()
root.mainloop()

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

Офлайн

#6 Ноя. 11, 2022 00:36:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9880
Репутация: +  853  -
Профиль   Отправить e-mail  

Ошибка в программе "Панграм"

dement3r
py.user.next
Неужели ошибка заключается только в том, что я просто поторопился?
Ты попытался написать всё и сразу. А писать надо методом отсечений. Написал простую программу, отладил её, она работает; тебе это точно известно и ты знаешь, что ошибок в ней нет. Дальше ты берёшь и пишешь поверх неё дополнительные элементы, которые тебе нужны, и потом с ними то же самое проделываешь; отладил - ошибок нет, всё работает. И после этого на этой рабочей версии начинаешь писать следующие дополнительные элементы и для них проделываешь то же самое всё. Это инкрементальная разработка, она позволяет избавляться от ошибок на ранних этапах, а не сваливать их все в одну большую кучу, а потом сидеть и думать, что пора бы это всё выкидывать, так как оно в тупик зашло. Всегда можно откатиться назад, если что-то не получилось, до рабочей промежуточной версии.

1. Поэтому тебе сначала надо написать просто окно, отладить его.
2. Потом тебе надо написать просто проверяльщик панграммы, который работает без всякого окна, просто в консоли, отладить его.
3. Потом тебе нужно соединить рабочее окно с рабочим проверяльщиком панграмм, отладить это совместное соединение.
4. Потом тебе надо написать запускальщик всего этого.

А ты же бросился писать в сломанном окне сломанный проверяльщик панграмм. Запустить ты это всё не можешь; то не работает, это не работает; где и какие ошибки есть, ты не знаешь; где ошибок нет, ты тоже не знаешь; отладить эту всю мешанину ты не можешь; откатываться на какой-то предыдущий правильный этап тебе некуда, так как никаких этапов у тебя нет; и так далее.


tags: incremental develop



Отредактировано py.user.next (Ноя. 11, 2022 00:41:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version