Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将宽度和高度(以像素为单位)转换为用于python库pyte的列?_Python_Terminal_Pyside - Fatal编程技术网

如何将宽度和高度(以像素为单位)转换为用于python库pyte的列?

如何将宽度和高度(以像素为单位)转换为用于python库pyte的列?,python,terminal,pyside,Python,Terminal,Pyside,背景 我正在用Python开发一个图形化ssh客户端。我将PySide用于GUI,Paramiko的分支用于ssh交互,而称为Pyte的库用于终端仿真 问题 我不知道如何根据正在调整大小的PySide QTextEdit来正确调整pyte终端的大小。我似乎只能以像素为单位获取QTextEdit的宽度和高度,而不是pyte库的Screen.resize()函数所需的列和行 1中的任何一个都有。获取QTextEdit或2的列和行计数。以在所有系统中都准确的方式将像素宽度和高度转换为列和行 建议的解决

背景

我正在用Python开发一个图形化ssh客户端。我将PySide用于GUI,Paramiko的分支用于ssh交互,而称为Pyte的库用于终端仿真

问题

我不知道如何根据正在调整大小的PySide QTextEdit来正确调整pyte终端的大小。我似乎只能以像素为单位获取QTextEdit的宽度和高度,而不是pyte库的Screen.resize()函数所需的列和行

1中的任何一个都有。获取QTextEdit或2的列和行计数。以在所有系统中都准确的方式将像素宽度和高度转换为列和行

建议的解决方案

用自定义调整大小事件处理程序替换QTextEdit.resizeEvent()函数,该处理程序将调用pyte的Screen.resize()函数来调整终端大小,以匹配QTextEdit小部件的新大小


如果有一个更简单的解决方案,我会乐于接受各种想法。

解决方案

最后,我为正在使用的小部件(QTextEdit)提取了字体度量和几何体信息。然后,我为QTextEdit实现了一个定制的调整大小事件,该事件处理捕获导致更新的不同事件上的状态(请参阅下面代码块中resizeConsoleEvent中的第一个if语句),然后计算新的可用列和行,并将它们传递给ssh对象(下面的self.shell)

代码

def resizeConsoleEvent(self, resizeObject):
    if not self.keyPressDown and not self.blockResizing:
        # calculate maximum columns and lines based on a '|' character
        font = self.ui.console.currentFont()
        fmetric = QtGui.QFontMetrics(font)
        fontPixelWidth = fmetric.width("|")
        fontPixelHeight = fmetric.height()
        availableWidthPixels = int(self.ui.console.geometry().width())
        availableHeightPixels = int(self.ui.console.geometry().height())
        # Calculate columns and lines w/ adjustments for rounding
        self.consoleColumns = int(availableWidthPixels / fontPixelWidth) + 1
        self.consoleLines = int(availableHeightPixels / fontPixelHeight) - 3

        # resize the pyte screen I'm using with the calculated information
        self.shell.resizeConsole(self.consoleLines, self.consoleColumns)

        # block double resize event
        self.keyPressDown = False
        return False
    else:

        return True

解决方案

最后,我为正在使用的小部件(QTextEdit)提取了字体度量和几何体信息。然后,我为QTextEdit实现了一个定制的调整大小事件,该事件处理捕获导致更新的不同事件上的状态(请参阅下面代码块中resizeConsoleEvent中的第一个if语句),然后计算新的可用列和行,并将它们传递给ssh对象(下面的self.shell)

代码

def resizeConsoleEvent(self, resizeObject):
    if not self.keyPressDown and not self.blockResizing:
        # calculate maximum columns and lines based on a '|' character
        font = self.ui.console.currentFont()
        fmetric = QtGui.QFontMetrics(font)
        fontPixelWidth = fmetric.width("|")
        fontPixelHeight = fmetric.height()
        availableWidthPixels = int(self.ui.console.geometry().width())
        availableHeightPixels = int(self.ui.console.geometry().height())
        # Calculate columns and lines w/ adjustments for rounding
        self.consoleColumns = int(availableWidthPixels / fontPixelWidth) + 1
        self.consoleLines = int(availableHeightPixels / fontPixelHeight) - 3

        # resize the pyte screen I'm using with the calculated information
        self.shell.resizeConsole(self.consoleLines, self.consoleColumns)

        # block double resize event
        self.keyPressDown = False
        return False
    else:

        return True

终端字体的大小总是固定的,所以我怀疑这只是乘以或除以适当的尺寸的问题。我整晚都在玩字体点大小转换成像素大小,再除以QWidget几何体的高度和宽度来确定列和行,但到目前为止还不是100%准确,虽然对于列,它似乎总是超出我需要的位置1个字符。不幸的是,QFontMetric对象需要maxWidth()(通常太大)或传递给width()的unicode字符才能将点转换为像素(因此,如果我使用几个比所选字符大的字符,则情况并非总是100%准确)。终端字体总是固定大小,所以我怀疑这只是乘以或除以适当的尺寸的问题。我整晚都在玩字体点大小转换成像素大小,然后除以QWidget几何体的高度和宽度来确定列和行,但到目前为止还不是100%准确,虽然对于列,它似乎总是超出我需要的位置1个字符。不幸的是,QFontMetric对象需要maxWidth()(通常太大)或传递给width()的unicode字符才能将点转换为像素(因此,如果使用比所选字符大的几个字符,则并非总是100%准确)。