Я пытаюсь изменить поведение программы на лету, отредактировав исходный файл (в Python 3.4.2, Windows 8.1). Моя программа представляет собой графический интерфейс tkinter
с кнопкой, которая суммирует два значения, но я хочу иметь возможность изменять поведение кнопки. В настоящее время я пытаюсь сделать это, отредактировав исходный файл (изменив, скажем, дополнение к вычитанию), сохранив его, а затем нажав кнопку, чья функция обратного вызова import
s - это исходный файл. Я хочу, чтобы изменения моего кода отражались в запущенном графическом интерфейсе без необходимости его завершения и перезапуска. Я также хочу, чтобы этот import
перекомпилировал только те строки, которые я изменил, а не весь файл.Изменение исходного файла во время работы программы
Программа, reload0.py
:
import time
import serial
import sys
import os
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
try:
import Tkinter # Python 2
import ttk
except ImportError:
import tkinter as Tkinter # Python 3
import tkinter.ttk as ttk
mGui = Tk()
mGui.title("GUI")
mGui.geometry('400x200+100+100')
def mOp():
num1 = value1.get()
num2 = value2.get()
Op=num1+num2
name1.set('Sum')
name2.set(Op)
def mReLoad():
import reload0.py
mGui.update()
def mCheck():
if len(name1.get()) == 0:
name1.set('name1')
mGui.update()
if (len(name2.get()) == 0):
name2.set('name2')
mGui.update()
try:
print(value1.get())
except ValueError:
value1.set(0)
mGui.update()
try:
print(value2.get())
except ValueError as ValE:
value2.set(0)
mGui.update()
print(ValE)
value1 = DoubleVar()
value2 = DoubleVar()
name1 = StringVar()
name2 = StringVar()
mButtonSave = Button(mGui, text = "Operation", command = mOp, fg = 'Red').place(x=150,y=80)
mButtonLoad = Button(mGui, text = "ReLoad Operation", command = mReLoad, fg = 'Red').place(x=150,y=110)
mButtonLoad = Button(mGui, text = "Check", command = mCheck, fg = 'Red').place(x=150,y=140)
tText1 = Entry(mGui, textvariable = name1).place(x=10,y=80)
tText2 = Entry(mGui, textvariable = name2).place(x=10,y=100)
vText1 = Entry(mGui, textvariable = value1).place(x=10,y=120)
vText2 = Entry(mGui, textvariable = value2).place(x=10,y=140)
Я предлагаю избегать термина 'reload', который имеет определенное значение в python и в значительной степени не поддерживается. Вместо этого используйте 'refresh' везде. – o11c
Python не позволит вам изменять исходные файлы, а затем просто «импортировать» их снова на лету. Что делать, если вы удалили определение класса или что-то еще? Что сделает интерпретатор с остальными объектами этого класса? Независимо от того, что вы пытаетесь сделать с этим, я гарантирую, что это проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – TigerhawkT3
Кроме того, в вашем коде есть только блоки «except», не привязанные к блокам 'try', несовместимые отступы и не-[PEP8] (https://www.python.org/dev/peps/pep-0008/) форматирование , – TigerhawkT3