如何给python添加解释器_如何使用tkinter在python中嵌入python解释器框架?

it isn't responding to commands

它不响应命令的原因是您没有将Text小部件(self.ttyText)链接到stdin。当前,当你输入时,它会将文本添加到小部件中,而不添加其他内容。这种链接可以类似于您已经使用stdout和stderr完成的操作。在

在实现这一点时,您需要跟踪小部件中文本的哪一部分是用户输入的文本—这可以使用标记(as described here)来完成。在the thread doesn't stop when the user closes the window.

我不认为没有一个“干净”的方法来解决这个问题而不需要重写主要的代码,但是一个似乎足够好的解决方案是它只需检测小部件何时被破坏并将字符串"\n\nexit()"写入解释器。这将调用解释器中的exit函数,这将导致对shell.interact的调用完成,从而使线程完成。在

在这里,不使用ado对代码进行了进一步修改:import tkinter as tk

import sys

import code

from threading import Thread

import queue

class Console(tk.Frame):

def __init__(self, parent, _locals, exit_callback):

tk.Frame.__init__(self, parent)

self.parent = parent

self.exit_callback = exit_callback

self.destroyed = False

self.real_std_in_out = (sys.stdin, sys.stdout, sys.stderr)

sys.stdout = self

sys.stderr = self

sys.stdin = self

self.stdin_buffer = queue.Queue()

self.createWidgets()

self.consoleThread = Thread(target=lambda: self.run_interactive_console(_locals))

self.consoleThread.start()

def run_interactive_console(self, _locals):

try:

code.interact(local=_locals)

except SystemExit:

if not self.destroyed:

self.after(0, self.exit_callback)

def destroy(self):

self.stdin_buffer.put("\n\nexit()\n")

self.destroyed = True

sys.stdin, sys.stdout, sys.stderr = self.real_std_in_out

super().destroy()

def enter(self, event):

input_line = self.ttyText.get("input_start", "end")

self.ttyText.mark_set("input_start", "end-1c")

self.ttyText.mark_gravity("input_start", "left")

self.stdin_buffer.put(input_line)

def write(self, string):

self.ttyText.insert('end', string)

self.ttyText.mark_set("input_start", "end-1c")

self.ttyText.see('end')

def createWidgets(self):

self.ttyText = tk.Text(self.parent, wrap='word')

self.ttyText.grid(row=0, column=0, sticky=tk.N + tk.S + tk.E + tk.W)

self.ttyText.bind("", self.enter)

self.ttyText.mark_set("input_start", "end-1c")

self.ttyText.mark_gravity("input_start", "left")

def flush(self):

pass

def readline(self):

line = self.stdin_buffer.get()

return line

if __name__ == '__main__':

root = tk.Tk()

root.config(background="red")

main_window = Console(root, locals(), root.destroy)

main_window.mainloop()

除了解决问题中所述问题的代码外,此代码几乎没有更改。在

与我之前的回答相比,这段代码的优点是它可以在单个进程中工作,因此可以在应用程序的任何一点创建,从而给程序员更多的控制权。在

{I不应该有一个基本的文本输出}和其他可编辑文本}的输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值