使用字符串以外的变量打印

2024-09-29 23:17:18 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法把字符串以外的变量从asciimatics库传递到print\u at?你知道吗

手册说明:

print_at(text, x, y, colour=7, attr=0, bg=0, transparent=False)
使用指定的颜色和属性在指定位置打印文本。
参数

  • 文本–要打印的(单行)文本。你知道吗
  • x–文本开头的列(x坐标)。你知道吗
  • y–文本开头的行(y坐标)。你知道吗
  • 颜色–要显示的文本的颜色。你知道吗
  • attr–要显示的文本的单元格属性。你知道吗
  • bg–要显示的文本的背景色。你知道吗
  • 透明–是否打印空格,从而提供透明效果。你知道吗

我正在测试的代码:

from asciimatics.screen import Screen

def print_test(screen):
    var1 = "string" #works
    var2 = int(2)   #error
    var3 = 3        #error
    var4 = [1,2,3]  #error
    var5 = (1,2,3)  #error
    screen.print_at(var1, 10, 10, 1, 1)
    screen.refresh()
    input()
Screen.wrapper(print_test)

完整代码: 程序创建以绿色“@”表示的起点,然后进行10次移动,以黄色“@”表示。我想实现的是将黄色“@”改为数字,以查看按哪个顺序进行步骤。你知道吗

from asciimatics.screen import Screen
import os
import random

os.system('mode con: cols=51')


def exit_point():
    global exitX
    global exitY

    wall = random.randint(1,4)

    if wall == 1:
        exitX = random.randint(1,49)
        exitY = 0
    elif wall == 2:
        exitX = 49
        exitY = random.randint(1,49)
    elif wall == 3:
        exitX = random.randint(1,49)
        exitY = 49
    elif wall == 4:
        exitX = 0
        exitY = random.randint(1,49)


def start_point():
    global startX
    global startY

    startX = random.randint(2,48)
    startY = random.randint(2,48)


def setup(screen):
    screen.fill_polygon([[(0, 0), (50, 0), (50, 50), (0, 50)],[(1, 1), (49, 1), (49, 49), (1, 49)]])
    exit_point()
    screen.print_at("#", exitX, exitY, 1, 1)
    start_point()
    screen.print_at("@", startX, startY, 2, 1)
    screen.refresh()
    input()



def move(screen):
    #trace list
    trace = []

    #bring back setup screen, waste of code but more intuiative
    screen.fill_polygon([[(0, 0), (50, 0), (50, 50), (0, 50)],[(1, 1), (49, 1), (49, 49), (1, 49)]])
    screen.print_at("#", exitX, exitY, 1, 1)
    screen.print_at("@", startX, startY, 2, 1)


    #Add starting point to the list
    point = [startX,startY]
    trace.append(point)

    #1st move
    moveX = startX + random.randint(-1,1)
    moveY = startY + random.randint(-1,1)
    point = [moveX,moveY]
    trace.append(point)
    screen.print_at("@", moveX, moveY , 3, 1)

    #more moves
    moves = 1
    while moves < 10:
        moveX = moveX + random.randint(-1,1)
        moveY = moveY + random.randint(-1,1)
        point = [moveX,moveY]
        if point not in trace: 
            trace.append(point)
            screen.print_at("@", moveX, moveY , 3, 1)
            moves = moves + 1

    screen.refresh()
    input()

Screen.wrapper(setup)
Screen.wrapper(move)
input()

Tags: 文本tracerandomscreenatpointprintrandint
2条回答

看来你的确切问题的答案是“不,你不能”。 然而,这并不意味着你不能实现你描述的目标。 作为参数传递时,为什么不将print_at要打印的数字转换成字符串呢?你知道吗

在你的大代码里是这样的

def print_test(screen):
    var1 = "string" #works
    var2 = int(2)   #error
    var3 = 3        #error # Let's try to pass this
    var4 = [1,2,3]  #error
    var5 = (1,2,3)  #error
    screen.print_at(str(var3), 10, 10, 1, 1) # Here is the conversion
    screen.refresh()
    input()
Screen.wrapper(print_test)

看起来print_at只接受字符序列。但是您可以在将值传递给函数之前将其转换为字符串。你知道吗

screen.print_at(str(var4), 10, 10, 1, 1)

如果您想“好的,但是将我的所有print_at调用更改为使用str()会很不方便”,那么您可以创建一个Screen的子类来自动执行。你知道吗

class PermissiveScreen(Screen):
    def print_at(self, text, *args, **kwargs):
        super().print_at(str(text), *args, **kwargs)

相关问题 更多 >

    热门问题