Фоновая картинка в черепахе. TurtleScreen () не отображается правильно в tkinter - PullRequest
0 голосов
/ 23 января 2019

Код 1: Создает окно Tk(), Frame(), Canvas() для размещения turtle.TurtleScreen() с определенной фоновой картинкой.Размеры этих виджетов не определены с самого начала.Вместо этого они определяются после создания виджета с использованием метода tkinter .configure() и метода turtle .screensize(). Проблема здесь заключается в том, что фоновое изображение не отображается правильно, даже если размер экрана черепахи отображается правильно.

Код 2: Он выполняет ту же работу, что и Код 1, за исключениемчто он сначала получает размер изображения и использует его, чтобы сначала определить размер виджета Canvas, а затем отобразить его как фоновое изображение turtle.TurtleScreen().Фоновое изображение отображается правильно.

Вопросы:

  1. Почему проблема возникает в коде 1 и как ее решить, т.е. правильно показать фонизображение в turtle.TurtleScreen() в случае изменения размера фонового изображения?
  2. Почему размеры виджетов Frame и Canvas на 2 пикселя больше для кода 1, чем для кода 2, хотя Canvas определяется с borderwidth=0?Это как-то связано с границей по умолчанию Canvas = 2?

Код 1:

import tkinter as tk
import turtle as tt


root = tk.Tk()

def getsize( widget ):
    widget.update_idletasks()
    w = widget.winfo_width()
    h = widget.winfo_height()
    print( 'w={}, h={}\n'.format(w,h) )
    return w,h

app = tk.Frame( root,  )
canvas = tk.Canvas( app, bg='yellow', borderwidth=0, )
app.grid( row=0, column=0, sticky='nsew' ) 
canvas.grid( row=0, column=0, sticky='nsew' )
print('\nFrame'); aw, ah = getsize( app )
print('canvas'); cw, ch = getsize( canvas )

pic = 'test.gif'
screen = tt.TurtleScreen( canvas )
screen.bgpic( pic )
screen.bgcolor( 'pink' )
screen.update()
print( 'Turtle :' )
print( 'screen size = ', screen.screensize() )
print( 'screen attributes = ', screen.__dict__ )
print( 'screen.bgpic() = ', screen.bgpic() )
photoimage = screen._bgpics[pic]
pw = photoimage.width()
ph = photoimage.height()
print( '\nphotoimage width={} height={}'.format( pw, ph) )

canvas.configure( width=pw+2, height=ph+2 )
screen.screensize( pw+2, ph+2 )
screen.bgpic( pic )

print('\nFrame'); aw, ah = getsize( app )
print('canvas'); cw, ch = getsize( canvas )

Код 2:

import tkinter as tk
import turtle as tt


root = tk.Tk()

pic ='test.gif'
image = tk.PhotoImage( file=pic )
iw = image.width()
ih = image.height()
print( 'image width={} height={}\n'.format( iw, ih) )

def getsize( widget ):
    widget.update_idletasks()
    w = widget.winfo_width()
    h = widget.winfo_height()
    print( 'w={}, h={}\n'.format(w,h) )
    return w,h

app = tk.Frame( root, )
canvas = tk.Canvas( app, width=iw, height=ih, bg='yellow', borderwidth=0 )
app.grid( row=0, column=0, sticky='nsew' ) 
canvas.grid( row=0, column=0, sticky='nsew' )
print('Frame'); aw, ah = getsize( app )
print('canvas'); cw, ch = getsize( canvas )

screen = tt.TurtleScreen( canvas )
screen.bgpic( pic )
screen.bgcolor( 'pink' )
screen.update()
print( 'Turtle :' )
print( 'screen size = ', screen.screensize() )
print( 'screen attributes = ', screen.__dict__ )
print( 'screen.bgpic() = ', screen.bgpic() )
photoimage = screen._bgpics[pic]
pw = photoimage.width()
ph = photoimage.height()
print( '\nphotoimage width={} height={}'.format( pw, ph) )

1 Ответ

0 голосов
/ 24 января 2019

Ответ на вопрос 1:

После дальнейших исследований я обнаружил, что TurtleScreen() имеет атрибут с именем .cv, указывающий на переданный в него виджет tk.Canvas.Как и для всех виджетов tk.Canvas, необходимо обновить (т.е. настроить) его scrollregion, чтобы отобразить новую видимую область tk.Canvas при наличии изменений.Опция «scrollregion» указывает, насколько большую область можно прокрутить.

Итак, изменения в коде 1 мне нужно было заменить:

canvas.configure( width=pw+2, height=ph+2 )
screen.screensize( pw+2, ph+2 )
screen.bgpic( pic )

на

canvas.configure( width=pw, height=ph, borderwidth=0 )
w = int(screen.cv.cget("width"))
h = int(screen.cv.cget("height"))
screen.cv.configure(scrollregion = (-w//2, -h//2, w//2+1, h//2 ))
print( '\nscreen.cv width={} height={}'.format( w, h) )

Ответ на Q2:

Разница в отчете Размеры фрейма и холста на 2 пикселя были связаны с +2 в коде 1:

canvas.configure( width=pw+2, height=ph+2 )

Вместо этого я должен был использовать:

canvas.configure( width=pw, height=ph )

Кажется, что Canvas потребляет 1 строку / столбец пикселя для формирования своей границы.

...