Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2020 00:17:11

VitEsk
Зарегистрирован: 2020-02-18
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

привет, подскажите пожалуйста, - есть небольшая программа,(импорт tkinter) в ней есть кнопка по нажатии на которую планировалось вызывать функцию, которая будет перезагружать саму программу.. чтобы после ее нажатия состояние было как при запуске проги, т.е. чтобы всё сбрасывалось . Читал про функцию reload, но она перезагружает только импортированные модули как я понял. Можно это вообще реализовать по простому? чтобы не прописывать сброс каждой переменной по отдельности… Буду благодарен за варианты.

Офлайн

#2 Фев. 23, 2020 11:46:59

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

VitEsk ну если втупую то

 os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) 
перезапустит само себя, но ИМХО, “это не наш метод”, как конкретно в вашем случае реализовать ХЗ потому как кода никакого нет, но если программа написана “правильно”, то достаточно вызова одной функции, чтобы “обнулить” до состояния “как при запуске”.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Фев. 23, 2020 16:37:16

VitEsk
Зарегистрирован: 2020-02-18
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

Понятно, значит легких путей нет..

Офлайн

#4 Фев. 23, 2020 18:18:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

VitEsk
Понятно, значит легких путей нет..
Приведенный код перезапустит приложение, ценой будет повторное создание процесса и полная потеря данных (например о положении окна что будет неприятно пользователю).

Поэтому не наш путь.

VitEsk
чтобы не прописывать сброс каждой переменной по отдельности
Я вообще не очень понимаю что такое сброс переменной. В языке предусмотрено только присвоение значений.
Архитектурно вы все равно должны инициализировать переменные. Вынесите инициализацию в функцию и просто еще раз ее вызовите.
Трудоемкость решения нулевая и нет никаких хитростей типа редлода или пересоздания процесса.



Офлайн

#5 Фев. 23, 2020 21:28:37

VitEsk
Зарегистрирован: 2020-02-18
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

doza_and
под сбросом переменных я подразумевал их возвращение к значениям по умолчанию. Хотя Возможно это и не критично в данном коде, но всё таки хотелось бы знать как это можно реализовать.

 """файл main.py"""
from tkinter import *
import tkinter.ttk as ttk
frm_bg = "#cecece"
root = Tk()
root.title("R-Calc")
root.geometry('600x300+700+50')
root.resizable(False, False)
u = 0
r = 0
i = 0
def choiceF():
    """настраивает внешний вид калькулятора под выбранную формулу"""
    if var.get() == 0:
        label2['text'] = "I=U/R"
        label3['text'] = "U="
        label4['text'] = "R="
        label5['text'] = "I="
        label8['text'] = "Вольт"
        label9['text'] = "Ом"
        label10['text'] = "Ампер"
        u = a
        r = b
    elif var.get() == 1:
        label2['text'] = "U=I*R"
        label3['text'] = "I="
        label4['text'] = "R="
        label5['text'] = "U="
        label8['text'] = "Ампер"
        label9['text'] = "Ом"
        label10['text'] = "Вольт"
        i = a
        r = b
    elif var.get() == 2:
        label2['text'] = "R=U/I"
        label3['text'] = "U="
        label4['text'] = "I="
        label5['text'] = "R="
        label8['text'] = "Вольт"
        label9['text'] = "Ампер"
        label10['text'] = "Ом"
        u = a
        i = b
def takeValues():
    if var.get() == 0:
        tok()
    elif var.get() == 1:
        napr()
    elif var.get() == 2:
        res()
def tok():
    """расчеты по первой формуле"""
    a = ent1.get()
    b = ent2.get()
    u = float(a)
    r = float(b)
    x = u / r
    if 1000 < x < 1000000:
        x = x / 1000
        label10['text'] = "килоАмпер"
    elif 0.001 < x < 1:
        x = x * 1000
        label10['text'] = "миллиАмпер"
    elif 0.000001 < x < 0.001:
        x = x / 10 ** 6
        label10['text'] = "микроАмпер"
    label7['text'] = round(x, 4)
def napr():
    """расчеты по второй формуле"""
    a = float(ent1.get())
    b = float(ent2.get())
    i = float(a)
    r = float(b)
    label7['text'] = round(a * b, 4)
def res():
    """расчеты по третьей формуле"""
    a = ent1.get()
    b = ent2.get()
    u = float(a)
    i = float(b)
    label7['text'] = round(u / i, 4)
def resetCalc():
    """очистка значений для повторного расчета"""
    pass
# расстановка и описание лейблов
label1 = Label(root, text="Выбите ниже нужный вариант \n формулы и нажмите «выбрать»")
label1.place(x=20, y=30)
label2 = Label(root, text="I=U/R", font="arial 16")
label2.place(x=320, y=160)
label3 = Label(root, text="".rjust(4), font="arial 16")
label3.place(x=235, y=65)
label4 = Label(root, text="".rjust(4), font="arial 16")
label4.place(x=235, y=95)
label5 = Label(root, text="".rjust(4), font="arial 16")
label5.place(x=235, y=125)
label6 = Label(root, text="Введите известные значения \n и нажмите «расчитать»")
label6.place(x=240, y=30)
label7 = Label(root, text="0".rjust(20), bg="#FCD9B6", font="arial 12")
label7.place(x=280, y=128)
label8 = Label(root, text="", font="arial 12")
label8.place(x=370, y=65)
label9 = Label(root, text="", font="arial 12")
label9.place(x=370, y=97)
label10 = Label(root, text="", font="arial 12")
label10.place(x=370, y=130)
# расстановка окон для ввода значений
a = IntVar()
b = IntVar()
ent1 = ttk.Entry(root, width=12, textvariable=a)
ent1.place(x=280, y=67)
ent2 = ttk.Entry(root, width=12, textvariable=b)
ent2.place(x=280, y=98)
# установка элемента radioButton
var = IntVar()
var.set(0)
rb1 = Radiobutton(text="ищем I по формуле:  I=U/R", variable=var, value=0)
rb1.place(x=20, y=80)
rb2 = Radiobutton(text="ищем U по формуле: U=I*R", variable=var, value=1)
rb2.place(x=20, y=100)
rb3 = Radiobutton(text="ищем R по формуле: R=U/I", variable=var, value=2)
rb3.place(x=20, y=120)
# расстановка и назначение действий кнопок
button1 = Button(text="Выбрать ", font="arial 10", command=choiceF)
button1.place(x=30, y=160)
button2 = Button(text="Рассчитать - ", font="arial 10", command=takeValues)
button2.place(x=220, y=160)
button3 = Button(text="Очистить\n/ввести новые\n значения", font="arial 10", height=3, command=resetCalc)
button3.place(x=450, y=60)
root.mainloop()

вот код, возможно так будет немного понятнее.

Офлайн

#6 Фев. 24, 2020 05:07:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

Из кода непонятно какие “все” переменные надо восстанавливать. похоже их четыре.

 def reset():
    global u,r,i,var
    u = 0
    r = 0
    i = 0
    var.set(0)
....
reset()
root.mainloop()

Ну и несколько комментариев по коду.
  • использование глобальных переменных нехорошо. не позволит масштабировать код, затрудняет поддержку.
  • Ручное размещение элементов исключает изменение размеров окна, да и сложнее чем с менеджерами размещения.
  • переменным желательно давать осмысленные имена а не просто нумеровать.
  • Если вам удобно обращаться к объектам по индексам, то почему вы не используете списки лейблов и кнопок?



Офлайн

#7 Фев. 24, 2020 08:05:03

VitEsk
Зарегистрирован: 2020-02-18
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос о перезагрузке главного модуля main

doza_and
Из кода непонятно какие “все” переменные надо восстанавливать. похоже их четыре.
спасибо за комментарии, учту.. я только месяц как занимаюсь питоном.. поэтому некоторые вещи для меня еще не очевидны.. )
это моя первая, более менее законченная и вменяемая программа которая работает )

Отредактировано VitEsk (Фев. 24, 2020 08:48:59)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version