如何解决如何计算画布大小以避免乌龟屏幕上的滚动条?
我在 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 举报,一经查实,本站将立刻删除。