python - pyqt5 应用程序中的嵌入式 qtconsole 无法按预期工作
问题描述
我有一个带有嵌入式 Jupyter QtConsole 4.4.2 的相当大的项目。
有关更多详细信息,请参阅: https ://github.com/3fon3fonov/trifon
现在,虽然一些进程正在运行/完成,但我正在尝试向 Qtconsole 发送一些文本并将其用作输出屏幕(反之亦然,我希望 Jupyter 能够在需要时控制 GUI,但这是我稍后必须处理的另一个问题)。
问题是“ConsoleWidget”功能的某些固有功能似乎不起作用,我找不到原因......
例如在我的主要 GUI 代码中:
ConsoleWidget_embed().push_vars({'fit':fit}) <-- WORKS!
ConsoleWidget_embed().clear() <-- Does not work!
ConsoleWidget_embed().print_text("Test string") <-- Does not work!
这是我嵌入到 Qtab 中的代码。
import numpy as np
import sys #,os
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from qtconsole.rich_jupyter_widget import RichJupyterWidget
from qtconsole.inprocess import QtInProcessKernelManager
from qtconsole.console_widget import ConsoleWidget
class ConsoleWidget_embed(RichJupyterWidget,ConsoleWidget):
global fit
def __init__(self, customBanner=None, *args, **kwargs):
super(ConsoleWidget_embed, self).__init__(*args, **kwargs)
if customBanner is not None:
self.banner = customBanner
#self.font_size = 4
self.kernel_manager = QtInProcessKernelManager()
self.kernel_manager.start_kernel(show_banner=True)
self.kernel_manager.kernel.gui = 'qt'
self.kernel = self.kernel_manager.kernel
self.kernel_client = self._kernel_manager.client()
self.kernel_client.start_channels()
#self._execute("kernel = %s"%fit, False)
def stop():
self.kernel_client.stop_channels()
self.kernel_manager.shutdown_kernel()
self.guisupport.get_app_qt().exit()
self.exit_requested.connect(stop)
def push_vars(self, variableDict):
"""
Given a dictionary containing name / value pairs, push those variables
to the Jupyter console widget
"""
self.kernel_manager.kernel.shell.push(variableDict)
def clear(self):
"""
Clears the terminal
"""
self._control.clear()
# self.kernel_manager
def print_text(self, text):
"""
Prints some plain text to the console
"""
self._append_plain_text(text, before_prompt=False)
def execute_command(self, command):
"""
Execute a command in the frame of the console widget
"""
self._execute(command, False)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = mainWindow()
main.show()
sys.exit(app.exec_())
任何想法将不胜感激!
一切顺利,特里丰
解决方案
在您的情况下,问题是您ConsoleWidget_embed
每次键入时都在创建一个ConsoleWidget_embed()
,而是创建该类的一个对象并将其设置为该类的属性:
self.console_widget = ConsoleWidget_embed()
self.terminal_embeded.addTab(self.console_widget, "Jupyter")
# ...
def jupiter_push_vars(self):
global fit
self.console_widget.push_vars({'fit':fit})
self.console_widget.clear()
self.console_widget.print_text("Test string")
推荐阅读
- google-cloud-firestore - Firestore分页-如何在查询后查找是否有更多数据(使用限制)
- c++ - C++ 零初始化具有可变数组长度的模板数组
- javascript - 如何让菜单在移动设备上向下滑动并在桌面上向右滑动?
- sql - 如何在 BigQuery 中解析位于 ("%m/%d/%Y %H:%M:%S") 的 CURRENT_DATETIME()
- batch-file - Cmd 合并 .txt 文件并删除行
- javascript - 有没有办法在 ASP.NET 中从 C# 运行 JavaScript 函数?
- android - 使用Android Maven Plugin 4+的android项目中非标准位置的文件或文件夹
- c# - 使用实体框架从修改列表中更新数据库表
- android - 使用 vue.js 和 android 的移动应用程序的区别
- php - 当我使用 docker multi-stage build 构建生产应用程序时,如何删除 composer dev 依赖项?