Форум сайта python.su
Добрый вечер.
Есть такой код:
#!/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()
Офлайн
vanvanovТак, он и заполняет полностью, как вы хотите. Назначьте канвасу цвет чтобы это увидеть:
Мне нужно, чтобы tk.Canvas заполнял все доступное пространство (в данном случае - 1024x768 за вычетом tk.Scrollbar), однако, данный виджет рисуется по центру с меньшим размером. Как это исправить?
cvs_prm = tk.Canvas(frm_prm, bg='red')
Офлайн
ramiOK, а почему Tk.Text не занимает все доступное пространство, если везде (в том числе, в родительских виджетах) указано expand=1?
Так, он и заполняет полностью, как вы хотите
Офлайн
Родитель у Tk.Text безразмерный фрейм frm_emb вставленный в безразмерное окно канваса, явных размеров нет ни у кого из троих (Tk.Text, фрейм и окно канваса), но у Tk.Text есть размер по умолчанию — его вы и видите. Задавайте размеры Tk.Text или окну в канвасе.
expand=1 означает заполнение всего назначенного пространства, но так как нет явных размеров, заполняются размеры по умолчанию.
Офлайн
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' )
Отредактировано vanvanov (Март 20, 2019 11:04:20)
Офлайн
А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов? Canvas нужен ещё для чего-нибудь?
Офлайн
ramiЯ хочу иметь окно фиксированного размера, но длинный фрейм, и использовать прокрутку внутри.
А зачем вставлять Text в окно Canvas? Да ещё использовать кучу фреймов?
Офлайн
Вы хотите чтобы при прокрутке канваса сам текстовый виджет перемещался по экрану уступая место другим виджетам расположенным на канвасе?
Офлайн
ramiЯ хочу иметь родительский виджет строго заданного размера (например, root или Toplevel на 1024x768), и фрейм внутри него гораздо большего размера, см., например,
уступая место другим виджетам расположенным на канвасе?
Отредактировано vanvanov (Март 20, 2019 11:52:57)
Офлайн
Теперь понятно. Позже посмотрю, как лучше это сделать.
Офлайн