微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何计算画布大小以避免乌龟屏幕上的滚动条?

如何解决如何计算画布大小以避免乌龟屏幕上的滚动条?

我在 python 中使用 turtle 并且我意识到如果画布的大小适合屏幕,则不会显示滚动条。我想知道计算画布大小涉及哪些数学运算,因此您可以选择屏幕大小,并且可以设置画布而不超过窗口大小,从而避免显示滚动条

我不知道数学计算是否会根据操作系统或显示设置而变化,但以下是我根据我的 Windows 10 环境所做的一些观察。以下仅适用于方形窗口 window_width = window_height 。要获得正确的画布大小,以下数字不会使滚动条出现:

def no_scrollbars_square_window(width):
    # w*h= 648*648,[2]
    # w*h= 649*649,[3]
    # w*h= 667*667,[21]
    window_width = width
    window_height = window_width 

    if window_width <= 648:
        border = 2
    elif window_width >= 667:
        border = 21
    else:
        border = window_width - 646

    Screen().screensize(canvwidth=window_width - border,canvheight=window_height - border)
    Screen().setup(window_width,window_height)
    print(window_width,window_height,border)
    Screen().exitonclick()

我即兴创作了一个模块 screen_adjuster.py修改和测试窗口的行为。

from turtle import Screen,Turtle,TurtleScreen

TURTLE_SIZE = 20
UP,DOWN,LEFT,RIGHT = "Up","Down","Left","Right"
SHIFT_L,SHIFT_R,ESCAPE,TAB = "Shift_L","Shift_R","Escape","Tab"
snapshots = []
recurse = True
border_flag = False

# Customizable setup values below
SQUARE_RATIO_MODE = False  # Toggle this flag to adjust borders/window sides independently
increment = 1
window_width = 648
border_width = 2
window_height = 648 if not SQUARE_RATIO_MODE else window_width
border_height = 2 if not SQUARE_RATIO_MODE else border_width
print(f"INITIALIZING: w*h = {window_width}*{window_height}  [{border_width}*{border_height}]  +{increment}")
print(f"SQUARE_RATIO_MODE = {SQUARE_RATIO_MODE}")
print(("Adjusting: " + ("BORDERS\n" if border_flag else "WINDOW\n")) if not SQUARE_RATIO_MODE else "")


def print_snapshots():
    print("\n\n\nSaved snapshots:\n----------------\n")
    for item in snapshots:
        print(item)


def start_adjusting():
    adjust()
    print_snapshots()


def print_window_data():
    print(f"w*h=  {window_width}*{window_height}  [{border_width}*{border_height}]  +{increment}")


def adjust():

    if SQUARE_RATIO_MODE:
        def increase_window():
            global window_width,window_height
            window_width += increment
            window_height += increment
            screen.bye()

        def decrease_window():
            global window_width,window_height
            window_width -= increment
            window_height -= increment
            screen.bye()

        def increase_border():
            global border_width,border_height
            border_width += increment
            border_height += increment
            screen.bye()

        def decrease_border():
            global border_width,border_height
            border_width -= increment
            border_height -= increment
            screen.bye()

        def change_window_width_and_height():
            global window_width,window_height
            while True:
                user_input = screen.numinput("Change window width and height","Enter a natural number (positive integer grater than zero):",window_width)
                if user_input is not None:
                    break
            window_width = int(user_input)
            window_height = int(user_input)
            screen.bye()
            print_window_data()

        def change_borders():
            global border_width,border_height
            while True:
                user_input = screen.numinput("Change border width and height",border_width)
                if user_input is not None:
                    break
            border_width = int(user_input)
            border_height = int(user_input)
            screen.bye()
            print_window_data()
    else:
        def increase_window_width():
            global window_width
            window_width += increment
            screen.bye()

        def increase_window_height():
            global window_height
            window_height += increment
            screen.bye()

        def decrease_window_width():
            global window_width
            window_width -= increment
            screen.bye()

        def decrease_window_height():
            global window_height
            window_height -= increment
            screen.bye()

        def increase_border_width():
            global border_width
            border_width += increment
            screen.bye()

        def increase_border_height():
            global border_height
            border_height += increment
            screen.bye()

        def decrease_border_width():
            global border_width
            border_width -= increment
            screen.bye()

        def decrease_border_height():
            global border_height
            border_height -= increment
            screen.bye()

        def change_window_width():
            global window_width
            while True:
                user_input = screen.numinput("Change window width",window_width)
                if user_input is not None:
                    break
            window_width = int(user_input)
            screen.bye()
            print_window_data()

        def change_window_height():
            global window_height
            while True:
                user_input = screen.numinput("Change window height",window_height)
                if user_input is not None:
                    break
            window_height = int(user_input)
            screen.bye()
            print_window_data()

        def change_borders():
            global border_width,border_height
            while True:
                width = screen.numinput("Change border width",border_width)
                if width is not None:
                    break
            border_width = int(width)
            while True:
                height = screen.numinput("Change border height",border_height)
                if height is not None:
                    break
            border_height = int(height)
            screen.bye()
            print_window_data()

    def change_increment():
        global increment
        while True:
            user_input = screen.numinput("Change increment",increment)
            if user_input is not None:
                break
        increment = int(user_input)
        print_window_data()

    def save_snapshot():
        global snapshots
        snapshots.append(f"w*h= {window_width}*{window_height}  [{border_width}*{border_height}]")

    def stop_recursion():
        global recurse
        recurse = False
        screen.bye()

    def toggle_border_flag():
        global border_flag
        border_flag = not border_flag
        if border_flag:
            print("Adjusting: BORDERS")
        else:
            print("Adjusting: WINDOW")
        screen.bye()

    canvas_width = window_width - border_width
    canvas_height = window_height - border_height
    screen = Screen()
    screen.screensize(canvwidth=canvas_width,canvheight=canvas_height)
    screen.setup(window_width,window_height)
    turtle = Turtle("circle")
    turtle.shapesize(min(canvas_width,canvas_height) / TURTLE_SIZE)
    print(f"w*h= {screen.window_width()}*{screen.window_height()}  [{screen.canvwidth}*{screen.canvheight}] <<turtle>>")
    if SQUARE_RATIO_MODE:
        screen.onkey(increase_window,RIGHT)
        screen.onkey(decrease_window,LEFT)
        screen.onkey(increase_border,UP)
        screen.onkey(decrease_border,DOWN)
        screen.onkey(change_window_width_and_height,"w")
        screen.onkey(change_window_width_and_height,"W")
        screen.onkey(change_window_width_and_height,"h")
        screen.onkey(change_window_width_and_height,"H")
    else:
        screen.onkey(toggle_border_flag,TAB)
        screen.onkey(change_window_width,"w")
        screen.onkey(change_window_width,"W")
        screen.onkey(change_window_height,"h")
        screen.onkey(change_window_height,"H")
        if border_flag:
            screen.onkey(increase_border_width,RIGHT)
            screen.onkey(decrease_border_width,LEFT)
            screen.onkey(increase_border_height,UP)
            screen.onkey(decrease_border_height,DOWN)
        else:
            screen.onkey(increase_window_width,RIGHT)
            screen.onkey(decrease_window_width,LEFT)
            screen.onkey(increase_window_height,UP)
            screen.onkey(decrease_window_height,DOWN)

    screen.onkey(change_borders,"b")
    screen.onkey(change_borders,"B")
    screen.onkey(change_increment,SHIFT_L)
    screen.onkey(change_increment,SHIFT_R)
    screen.onkey(save_snapshot,"s")
    screen.onkey(save_snapshot,"S")
    screen.onkey(stop_recursion,ESCAPE)
    screen.listen()
    print_window_data()

    screen.mainloop()
    TurtleScreen._RUNNING = True  # Avoid Terminator exception when creating turtle after closing screen
    if recurse:
        adjust()


if __name__ == '__main__' or __name__ == '__screen_adjuster__':
    start_adjusting()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。