Рамка внутри полосы прокрутки tkinter крошечная-не использует доступное пространство

#python #python-3.x #tkinter

Вопрос:

Как я могу исправить вид ? оно сложное и маленькое. Это из-за полосы прокрутки, но я не знаю, как это исправить.

Без полосы прокрутки все в порядке. Но если я добавлю это , то вот что я получу…

Не знаю, как это исправить..

Вы можете помочь ? введите описание изображения здесь

 import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry('400x300')
root.title('Notebook Demo')

notebook = ttk.Notebook(root)
notebook.pack(pady=10, expand=True)

frame1 = ttk.Frame(notebook, width=400, height=280)
frame2 = ttk.Frame(notebook, width=400, height=280)

frame1.pack(fill='both', expand=True)
frame2.pack(fill='both', expand=True)

text = tk.Text(frame1)
text.insert("end", "sss")
text.pack()

verscrlbar_frame1 = ttk.Scrollbar(text, orient="vertical")
horscrlbar_frame1 = ttk.Scrollbar(text, orient="horizontal")
text.config(xscrollcommand=horscrlbar_frame1.set, yscrollcommand=verscrlbar_frame1.set)

verscrlbar_frame1.config(command=text.yview)
horscrlbar_frame1.config(command=text.xview)

verscrlbar_frame1.pack(side='right', fill='y')
horscrlbar_frame1.pack(side='bottom', fill='x')

notebook.add(frame1, text='General Information')
notebook.add(frame2, text='Profile')

root.mainloop()
 

Комментарии:

1. разве вы не задавали этот вопрос час назад?

2. Изменить ttk.Scrollbar(text, ...) на ttk.Scrollbar(frame1, ...)

3. Во-первых, вам не нужно звонить frame1.pack(...) и frame2.pack(...) . Во-вторых, вам нужно изменить родительский элемент двух полос прокрутки с text на frame1 . Также вам нужно переместить text.pack() после упаковки две полосы прокрутки.

4. И я хочу, чтобы в текстовой строке был текст, а не рамка, если он с рамкой, то если я прокручу вниз, то я не увижу… @ TheLizzard @acw1668

5. Полосы прокрутки будут прокручивать только содержимое текстового виджета, а не рамку.

Ответ №1:

У вас есть две проблемы с вашим кодом.

Во-первых, вы добавляете текстовый виджет в рамку, но не приказываете ему расширяться или сжиматься, чтобы заполнить рамку. Таким образом, он будет таким, каким бы ни был его естественный размер. Вы должны настроить pack , чтобы текстовый виджет заполнял выделенную ему область:

 text.pack(fill="both", expand=True)
 

Во-вторых, вы добавляете полосы прокрутки внутри текстового виджета. Когда вы вызываете pack добавление полос прокрутки в текстовый виджет, текстовый виджет будет уменьшаться, чтобы соответствовать естественному размеру полос прокрутки. Поскольку вы не заставляли виджет расширяться, чтобы заполнить его рамку, он будет уменьшаться до размера, который вы видите.

Как правило, вы не должны размещать полосы прокрутки внутри текстового виджета. Это поведение является одной из причин, по которой вам не следует этого делать, но другая причина заключается в том, что полосы прокрутки будут накладывать текст по краям виджета.

Вы должны сделать полосы прокрутки дочерними элементами фрейма, а не текстового виджета. Если вы хотите, чтобы они выглядели так, как будто они находятся внутри текстового виджета, придайте рамке тот же цвет фона, что и текстовому виджету, и удалите границу текстового виджета.

 verscrlbar_frame1 = ttk.Scrollbar(frame1, orient="vertical")
horscrlbar_frame1 = ttk.Scrollbar(frame1, orient="horizontal")
 

Вероятно, вам также следует настроить порядок, в котором вы их упаковываете, хотя grid это немного лучший выбор, так как полосы прокрутки не будут перекрывать друг друга.

 verscrlbar_frame1.pack(side='right', fill='y')
horscrlbar_frame1.pack(side='bottom', fill='x')
text.pack(fill="both", expand=True)
 

Есть и третья проблема с вашим кодом, хотя она довольно безобидна. Вы вызываете pack frame1 и frame2 , но затем добавляете frame1 и frame2 в записную книжку. Нет смысла вызывать pack эти виджеты, так как вы добавляете их в записную книжку.

Комментарии:

1. Можете ли вы объяснить в коде, что я исправляю ? @Брайан Оукли

2. И я хочу, чтобы в текстовой строке был текст, а не рамка, если он с рамкой, то если я прокручу вниз, то я не увижу… @Брайан Оукли

3. @Alex: Я не предлагал прокручивать кадр. Полосы прокрутки не должны (и не должны) находиться в виджете, который они прокручивают. Как я уже сказал, полосы прокрутки должны быть во фрейме, а не в текстовом виджете.