Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2019 20:46:41

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

Добрый вечер.
Есть такой код:

 #!/usr/bin/python3
# -*- coding: UTF-8 -*-
import tkinter as tk
x = 1024
y = 768
root = tk.Tk()
root.geometry('{}x{}'.format(x,y))
frm_prm = tk.Frame(root)
frm_prm.pack(expand=1,fill='both')
frm_ver = tk.Frame(frm_prm)
frm_ver.pack (expand = 0
             ,fill   = 'y'
             ,side   = 'right'
             )
cvs_prm = tk.Canvas(frm_prm)
cvs_prm.pack(expand=1,fill='both')
frm_emb = tk.Frame(frm_prm)
frm_emb.pack(expand=1,fill='both')
cvs_prm.create_window(0,0,window=frm_emb)
txt_prm = tk.Text(frm_emb)
txt_prm.pack(expand=1,fill='both')
txt_prm.insert('1.0','hello')
scrollbar = tk.Scrollbar (master = frm_ver
                         ,orient = 'vertical'
                         )
scrollbar.pack (expand = 1
               ,fill   = 'y'
               ,side   = 'right'
               )
cvs_prm.configure (scrollregion = (-x/2,-y/2,x/2,y/2)
                  )
cvs_prm.xview_moveto(0)
cvs_prm.yview_moveto(0)
txt_prm.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=cvs_prm.yview)
root.mainloop()
Мне нужно, чтобы tk.Canvas заполнял все доступное пространство (в данном случае - 1024x768 за вычетом tk.Scrollbar), однако, данный виджет рисуется по центру с меньшим размером. Как это исправить?

Офлайн

#2 Март 19, 2019 21:15:59

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

vanvanov
Мне нужно, чтобы tk.Canvas заполнял все доступное пространство (в данном случае - 1024x768 за вычетом tk.Scrollbar), однако, данный виджет рисуется по центру с меньшим размером. Как это исправить?
Так, он и заполняет полностью, как вы хотите. Назначьте канвасу цвет чтобы это увидеть:
 cvs_prm = tk.Canvas(frm_prm, bg='red')

Офлайн

#3 Март 19, 2019 21:38:28

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

rami
Так, он и заполняет полностью, как вы хотите
OK, а почему Tk.Text не занимает все доступное пространство, если везде (в том числе, в родительских виджетах) указано expand=1?

Офлайн

#4 Март 20, 2019 08:20:39

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

Родитель у Tk.Text безразмерный фрейм frm_emb вставленный в безразмерное окно канваса, явных размеров нет ни у кого из троих (Tk.Text, фрейм и окно канваса), но у Tk.Text есть размер по умолчанию — его вы и видите. Задавайте размеры Tk.Text или окну в канвасе.

expand=1 означает заполнение всего назначенного пространства, но так как нет явных размеров, заполняются размеры по умолчанию.

Офлайн

#5 Март 20, 2019 11:04:01

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

rami
Спасибо! Решил проблему так:

 frm_emb = tk.Frame (master = frm_prm
                    ,width  = x - 30
                    ,height = y
                    )
frm_emb.pack_propagate(False)
frm_emb.pack (expand = 1
             ,fill   = 'both'
             )
Я просто не учел, что размеры tk.Canvas, похоже, не коррелируют с размерами root.

Отредактировано vanvanov (Март 20, 2019 11:04:20)

Офлайн

#6 Март 20, 2019 11:16:39

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов? Canvas нужен ещё для чего-нибудь?

Офлайн

#7 Март 20, 2019 11:23:01

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

rami
А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов?
Я хочу иметь окно фиксированного размера, но длинный фрейм, и использовать прокрутку внутри.

Офлайн

#8 Март 20, 2019 11:35:38

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

Вы хотите чтобы при прокрутке канваса сам текстовый виджет перемещался по экрану уступая место другим виджетам расположенным на канвасе?

Офлайн

#9 Март 20, 2019 11:50:52

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

rami
уступая место другим виджетам расположенным на канвасе?
Я хочу иметь родительский виджет строго заданного размера (например, root или Toplevel на 1024x768), и фрейм внутри него гораздо большего размера, см., например, .
Внутри фрейма может быть текстовый виджет, а может быть и большое количество tk.Label и tk.Entry. Прокрутку у меня получается прикрутить только к tk.Canvas, поэтому его и использую.

Отредактировано vanvanov (Март 20, 2019 11:52:57)

Офлайн

#10 Март 20, 2019 11:58:32

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

Теперь понятно. Позже посмотрю, как лучше это сделать.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version