exec()

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
здравствуйте, в exec() как можно сделать, чтобы не плодить много файлов, а чтобы было всё в одном файле, чтобы в нём было несколько процедур, как их оформить и как вызвать нужную? спасибо, пока, что у меня так:
Код:
with open('MsgBoxOK.py', 'r', encoding='utf-8') as f: module = f.read() # возможно любое текстовое расширение txt, py
exec(module)
файл MsgBoxOK.py вместе с проектом, его содержимое:
Код:
# MsgBox$ "Текст сообщения=Prompt",, "Заголовок=Title" 'VBA OK = 1
title = 'Сообщение' # title = заголовок;
prompt = 'Работа завершена' # prompt = подсказка, \n - абзац
from tkinter import *
def click_button(): root.destroy() # destroy = уничтожать, разрушать
root = Tk()
root.title(title)
root.geometry('300x200')  # ширина Х высота
# названия шрифта, размер, стиль bold=полужирное начертание, normal — нормальное начертание
Label1 = Label(text=prompt, font=('Arial', 12, 'bold'))
Label1.place(x=10, y=10)
# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
# Label1.pack() # метод pack(), чтобы сделать элемент видимым
btn = Button(text="OK",  # текст кнопки
             background="#555",  # фоновый цвет кнопки
             foreground="#ccc",  # цвет текста
             padx="30",  # ширина
             pady="10",  # высота
             font="16",  # высота шрифта
             command=click_button)  # обработчик кнопки
btn.place(x=180, y=130)
# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
# btn.pack() # метод pack(), чтобы сделать элемент видимым
root.mainloop()  # оставляем окно открытым
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
# привязка к кнопкам
спасибо, чтобы не гадать, лучше спрошу куда привязку помещать?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
спасибо, чтобы не гадать, лучше спрошу куда привязку помещать?
Это просто код кнопки, привязка это значение параметра command:
Python:
command=lambda: click_button(btnY['text'])
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
Это просто код кнопки, привязка это значение параметра command:
command=lambda: click_button(btnY['text'])
извините, с первого раза не дошло, можете пояснить?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Это просто код кнопки, привязка это значение параметра command:
command=lambda: click_button(btnY['text'])
извините, с первого раза не дошло, можете пояснить?
Имеется ввиду что к кнопкам в параметр command нужно указать lambda: click_button(btnY['text']):
Python:
btnY = Button(text='Yes',  # текст кнопки
             background='#555',  # фоновый цвет кнопки
             foreground='#ccc',  # цвет текста
             padx='30',  # НЕ ширина кнопки, а отступ от границ кнопки до её текста справа и слева justify: устанавливает выравнивание текста, значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
             pady='10',  # НЕ высота кнопки, отступ от границ кнопки до её текста сверху и снизу justify: устанавливает выравнивание текста, значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
             font='16',  # высота шрифта
             command=lambda: click_button(btnY['text']))  # обработчик кнопки
btnY.place(x=20, y=130, width=50, height=50) # width=ширина кнопки, height=высота кнопки
# !!!!!!!!!!!!!! при использовании метода place() не надо использовать метод pack()
# btnY.pack() # метод pack(), чтобы сделать элемент видимым
btnN = Button(text='No',  # текст кнопки
              background='#555',  # фоновый цвет кнопки
              foreground='#ccc',  # цвет текста
              padx='30',  # ширина
              pady='10',  # высота
              font='16',  # высота шрифта
              command=lambda: click_button(btnN['text']))  # обработчик кнопки
btnN.place(x=180, y=130, width=50, height=50) # width=ширина кнопки, height=высота кнопки
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
сорри, теперь ошибка
command=lambda: click_button(btnY['text'])) # обработчик кнопки
TypeError: MsgBoxYesNo.<locals>.click_button() takes 0 positional arguments but 1 was given
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
TypeError: MsgBoxYesNo.<locals>.click_button() takes 0 positional arguments but 1 was given
В определении функции нужно указать что она принимает аргумент (видимо вы его не добавили):
Python:
# функция, принимает аргумент txt
def click_button(txt):
    nonlocal btn_text  # меняем значение внешней переменной
    root.destroy() # destroy = уничтожать, разрушать
    if txt == 'Yes':
        btn_text = 'Y'
    else:
        btn_text = 'N'
    print('print из def MsgBoxYesNo, btn_text: ' + btn_text)
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
респект, всё ясно
 

Форум IT Специалистов