Найти - Пользователи
Полная версия: вопрос о перезагрузке главного модуля main
Начало » Центр помощи » вопрос о перезагрузке главного модуля main
1
VitEsk
привет, подскажите пожалуйста, - есть небольшая программа,(импорт tkinter) в ней есть кнопка по нажатии на которую планировалось вызывать функцию, которая будет перезагружать саму программу.. чтобы после ее нажатия состояние было как при запуске проги, т.е. чтобы всё сбрасывалось . Читал про функцию reload, но она перезагружает только импортированные модули как я понял. Можно это вообще реализовать по простому? чтобы не прописывать сброс каждой переменной по отдельности… Буду благодарен за варианты.
PEHDOM
VitEsk ну если втупую то
 os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) 
перезапустит само себя, но ИМХО, “это не наш метод”, как конкретно в вашем случае реализовать ХЗ потому как кода никакого нет, но если программа написана “правильно”, то достаточно вызова одной функции, чтобы “обнулить” до состояния “как при запуске”.
VitEsk
Понятно, значит легких путей нет..
doza_and
VitEsk
Понятно, значит легких путей нет..
Приведенный код перезапустит приложение, ценой будет повторное создание процесса и полная потеря данных (например о положении окна что будет неприятно пользователю).

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

VitEsk
чтобы не прописывать сброс каждой переменной по отдельности
Я вообще не очень понимаю что такое сброс переменной. В языке предусмотрено только присвоение значений.
Архитектурно вы все равно должны инициализировать переменные. Вынесите инициализацию в функцию и просто еще раз ее вызовите.
Трудоемкость решения нулевая и нет никаких хитростей типа редлода или пересоздания процесса.
VitEsk
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()

вот код, возможно так будет немного понятнее.
doza_and
Из кода непонятно какие “все” переменные надо восстанавливать. похоже их четыре.
 def reset():
    global u,r,i,var
    u = 0
    r = 0
    i = 0
    var.set(0)
....
reset()
root.mainloop()

Ну и несколько комментариев по коду.
  • использование глобальных переменных нехорошо. не позволит масштабировать код, затрудняет поддержку.
  • Ручное размещение элементов исключает изменение размеров окна, да и сложнее чем с менеджерами размещения.
  • переменным желательно давать осмысленные имена а не просто нумеровать.
  • Если вам удобно обращаться к объектам по индексам, то почему вы не используете списки лейблов и кнопок?
VitEsk
doza_and
Из кода непонятно какие “все” переменные надо восстанавливать. похоже их четыре.
спасибо за комментарии, учту.. я только месяц как занимаюсь питоном.. поэтому некоторые вещи для меня еще не очевидны.. )
это моя первая, более менее законченная и вменяемая программа которая работает )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB