Найти - Пользователи
Полная версия: [tkinter] Как развернуть tk.Canvas до размеров tk.Frame?
Начало » Python для новичков » [tkinter] Как развернуть tk.Canvas до размеров tk.Frame?
1 2
vanvanov
Добрый вечер.
Есть такой код:
 #!/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), однако, данный виджет рисуется по центру с меньшим размером. Как это исправить?
rami
vanvanov
Мне нужно, чтобы tk.Canvas заполнял все доступное пространство (в данном случае - 1024x768 за вычетом tk.Scrollbar), однако, данный виджет рисуется по центру с меньшим размером. Как это исправить?
Так, он и заполняет полностью, как вы хотите. Назначьте канвасу цвет чтобы это увидеть:
 cvs_prm = tk.Canvas(frm_prm, bg='red')
vanvanov
rami
Так, он и заполняет полностью, как вы хотите
OK, а почему Tk.Text не занимает все доступное пространство, если везде (в том числе, в родительских виджетах) указано expand=1?
rami
Родитель у Tk.Text безразмерный фрейм frm_emb вставленный в безразмерное окно канваса, явных размеров нет ни у кого из троих (Tk.Text, фрейм и окно канваса), но у Tk.Text есть размер по умолчанию — его вы и видите. Задавайте размеры Tk.Text или окну в канвасе.

expand=1 означает заполнение всего назначенного пространства, но так как нет явных размеров, заполняются размеры по умолчанию.
vanvanov
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.
rami
А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов? Canvas нужен ещё для чего-нибудь?
vanvanov
rami
А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов?
Я хочу иметь окно фиксированного размера, но длинный фрейм, и использовать прокрутку внутри.
rami
Вы хотите чтобы при прокрутке канваса сам текстовый виджет перемещался по экрану уступая место другим виджетам расположенным на канвасе?
vanvanov
rami
уступая место другим виджетам расположенным на канвасе?
Я хочу иметь родительский виджет строго заданного размера (например, root или Toplevel на 1024x768), и фрейм внутри него гораздо большего размера, см., например, .
Внутри фрейма может быть текстовый виджет, а может быть и большое количество tk.Label и tk.Entry. Прокрутку у меня получается прикрутить только к tk.Canvas, поэтому его и использую.
rami
Теперь понятно. Позже посмотрю, как лучше это сделать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB