2016-04-02 3 views
2

Я пытаюсь создать программу, в которой вы можете ввести код в записи, и программа выполнит код.Моя программа exec не работает

Когда вы нажмете Enter, программа создаст еще одну запись под предыдущей.

Когда вы нажмете кнопку «Execute Program», весь написанный вами код будет выполнен.

from tkinter import * 

class Application(Frame): 
    def __init__(self, master): 
    Frame.__init__(self, master) 
    self.grid() 

    self.entry1=Entry(self) 
    self.entry1.grid(row=0, column=0, sticky=W) 

    self.bttn1=Button(self, text="Execute code", command=self.execute_code) 
    self.bttn1.grid(row=1, column=9, sticky=W) 

    self.rows=0 

    self.entry1.bind("<Return>", self.down) 



    def execute_code(self): 
     self.code=self.entry1.get() 

     try: 
     exec(self.code) 
     except: 
     print("There is something wrong with this code!") 

def down(self,event): 
     self.rows+=1 

     entry=Entry(self) 
     entry.grid(row=self.rows, column=0, sticky=W) 
     self.code=self.code+"\n"+entry.get() 
     entry.bind("<Return>", self.down) 


root=Tk() 
root.title("Executing code") 
root.geometry("500x500") 
app=Application(root) 

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

Может кто-нибудь сказать мне, что не так в моем коде?

+0

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

+0

Выполняет для say print (3), что вы пытаетесь сделать? –

+0

И он падает, когда вы нажимаете Enter. –

ответ

1

То, как вы обрабатываете записи «многострочные», не работает. При нажатии Введите, вы создаете новый виджет Entry и сразу же добавьте его содержимое в self.code. Однако в этот момент контент '', и вы не сохраните ссылку на этот новый Entry, так что нет возможности получить контент позже, после того, как у пользователя появилась возможность ввести какой-либо текст.

Вы могли магазин различные Entry экземпляры в списке, но вместо этого я предлагаю вам просто использовать один многостраничный линию Text виджета:

class Application(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.grid() 

     self.entry1 = Text(self) 
     self.entry1.grid(row=0, column=0, sticky=W) 

     self.bttn1 = Button(self, text="Execute code", command=self.execute_code) 
     self.bttn1.grid(row=1, column=0, sticky=W) 

    def execute_code(self): 
     code = self.entry1.get("0.0", "end") 
     try: 
      exec(code) 
     except: 
      print("There is something wrong with this code!") 
Смежные вопросы