Python - Tkinter Scrollbar Ekleyemiyorum!

Merhaba iyi forumlar herkese,

Programda ekranda aktif olan tablo da satır sayısı arttığı zaman scrollbar ile aşağı inmek istiyorum. Pencere boyutu aynı kalacak şekilde bunu yapmak istedim. Fakat scrollbar’ı bir türlü ekleyemiyorum. Tkinter derslerinde scrollbar’ı text alanı içerisine eklemeyi öğrendim. Orada yaptıklarımı direk pencereye uyarlamaya çalıştım fakat olmadı. Bu ekrana nasıl scrollbar ekleyebilirim?

Kod paylaşmam gerekiyorsa diye ekranı aktif eden kod şudur;

from tkinter import *
from function.program.information import start_information
import sqlite3

class Application(object):

    def __init__(self):

        self.main()

    def main(self):

        self.con = sqlite3.connect("database/database.db")
        self.cursor = self.con.cursor()

        self.cursor.execute("SELECT * FROM SINAV_DATA")
        self.sinav_data = self.cursor.fetchall()
        self.con.commit()

        self.cursor.execute("SELECT TOTAL FROM SINAV_DATA")
        self.total_data = self.cursor.fetchall()
        self.con.commit()

        self.con.close()

        self.toplam = 0

        for self.i in self.total_data:

            self.toplam += self.i[0]

        if len(self.sinav_data) == 0:

            self.sinav_data = [(0,0,0)]

        self.pencere1 = Tk()
        self.pencere1.title(start_information.last_rapor_name_title)
        self.pencere1.geometry("395x200+685+390")
        self.pencere1.resizable(FALSE, FALSE)

        self.cerceve1 = Frame(self.pencere1)
        self.cerceve1.grid(row=0, column=0, padx=5)

        # sütun

        self.button1 = Button(self.pencere1, text="İŞLEM TARİHİ", width=14)
        self.button1.grid(row=0, column=0)

        self.button2 = Button(self.pencere1, text="TOPLAM", width=14)
        self.button2.grid(row=0, column=1)

        self.button3 = Button(self.pencere1, text="KAYIT TARİHİ", width=20)
        self.button3.grid(row=0, column=2)

        self.satir = 1
        self.sutun = 0
        self.first_index = 0
        self.second_index = 0
        self.eleman = len(self.sinav_data)
        self.list_index = self.eleman - 1

        self.durum = True

        while self.durum:

            self.etiket1 = Label(self.pencere1, width=16, text=self.sinav_data[self.first_index][self.second_index])
            self.etiket1.grid(row=self.satir, column=self.sutun)

            self.second_index += 1
            self.sutun += 1

            if self.second_index > 2 and self.sutun > 2:

                self.second_index = 0
                self.sutun = 0

                self.first_index += 1
                self.satir += 1

                if self.first_index == self.eleman:

                    self.etiket1 = Label(self.pencere1, text="TOPLAM", font="Helvatica 14 bold")
                    self.etiket1.grid(row=self.satir, column=0)
                    self.etiket1 = Label(self.pencere1, text=self.toplam, font="Helvatica 14 bold")
                    self.etiket1.grid(row=self.satir, column=1)

                    self.durum = False

            else:
                print("Rapor Oluşturuluyor")

Merhaba,

Tablo, oluşturmak istiyorsanız, Treeview modülünü kullanmanızı öneririm.

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import tkinter as tk

from tkinter.ttk import Treeview as Tv


class Treeview(Tv):
    def __init__(self, columns: list, values: list, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.columns = columns
        self.values = values
        self.y_scrollbar = tk.Scrollbar(
            master=self.master,
            orient="vertical"
        )
        self.configure(yscrollcommand=self.y_scrollbar.set)
        self.y_scrollbar.configure(command=self.yview)
        self.y_scrollbar.pack(side="right", fill="y")
        self.configure(
            show="headings",
            columns=[f"#{i + 1}" for i in range(len(self.columns))],
            height=20,
            selectmode="extended"
        )
        self.pack(side="left")
        for index, column in enumerate(self.columns):
            self.column(
                column=f"#{index + 1}",
                minwidth=100,
                width=200,
                anchor="center"
            )
            self._heading(col=index, text=column)
        for i in range(len(self.values[0])):
            self.insert(
                parent="", 
                index=i, 
                values=[j[i] for j in self.values]
        )
        self.bind(
            sequence="<Control-a>",
            func=lambda event: self.select_all()
        )
        self.bind(
            sequence="<Control-A>",
            func=lambda event: self.select_all()
        )

    def _heading(self, col: int, text: str):
        self.heading(
            column=f"#{col + 1}",
            text=text,
            command=lambda: self.sort(col=col, reverse=False)
        )

    def sort(self, col: int, reverse: bool):
        column = [
            (self.set(k, col), k)
            for k in self.get_children("")
        ]
        try:
            column.sort(key=lambda t: int(t[0]), reverse=reverse)
        except ValueError:
            column.sort(reverse=reverse)
        for index, (val, k) in enumerate(column):
            self.move(k, "", index)
        self.heading(
            column=col,
            command=lambda: self.sort(col=col, reverse=not reverse)
        )

    def select_all(self):
        for child in self.get_children():
            self.selection_add(child)
            

if __name__ == "__main__":           
    root = tk.Tk()
    tv = Treeview(
        master=root, 
        columns=["A Sütunu", "B Sütunu"], 
        values=[[*range(100)], [i ** 2 for i in range(100)]]
    )
    root.mainloop()
1 Beğeni

bu daha güzelmiş. Teşekkür ederim. Ben bunu inceleyip programıma dahil edeceğim. Ama yine de sormak istiyorum içerisinde Text() kullanmadığım bir pencereye nasıl scrollbar ekleyeceğim

Canvas kullanabilirsiniz bunun için.

Örnek olsun diye gösteriyorum.

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import tkinter as tk


class Canvas(tk.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame = tk.Frame(master=self)
        self.y_scrollbar = tk.Scrollbar(
            master=self.master,
            orient="vertical",
            command=self.yview
        )
        self.configure(yscrollcommand=self.y_scrollbar.set)
        self.y_scrollbar.pack(side="right", fill="y")
        self.pack(side="left", expand=True, fill="both")
        self.create_window((4, 4), window=self.frame, anchor="nw")
        self.frame.bind(
            sequence="<Configure>",
            func=lambda event: self.configure(
                scrollregion=self.bbox("all")
            )
        )
        # Örnek widgetler
        for i in range(1, 50):
            button = tk.Button(master=self.frame, text=f"Button-{i}")
            button.pack()
            

if __name__ == "__main__":
    root = tk.Tk()
    canvas = Canvas(master=root)
    root.mainloop()

Tamamdır. Tablo oluştururken Treeview pencere içinde canvas kullanacağım. Teşekkür ederim tekrardan. Hayırlı akşamlar

Tablo oluştururken Treeview ile birlikte Canvas kullanamazsınız. Tablonuz için ya Treeview kullanın ya da Canvas'ın create_window metodunu kullanın, bu metod bir Frame açsın.

Demek istediğim. Tablolu pencereler de Treeview, tablo olmayan ama scroll gerektiren şeyler de canvas kullanacağım.

Tamam, burada dikkat etmeniz gereken şey; Canvas'ın create_window metodunu kullanarak bir tane pencere oluşturmanız gerektiği. Bu pencere bir Frame olsun.

Frame’leri pencere elemanları arasında mesafe oluşturmak dışında kullanım yerleri de mi var?

Konteyner olarak kullanabilirsiniz. Daha açık bir ifadeyle şöyle anlatayım; ekrana yerleştirilecek bir çok widgetiniz var diyelim, bu widgetlerin bazılarının belli yerlerde bir arada durmalarını, başka widgetlerin de ekranın başka bir yerinde bir arada durmalarını istiyorsunuz diyelim, böyle durumlarda Frame widgeti oldukça işe yarıyor. Frame widgetini, HTML kodlarındaki div etiketine benzetmişimdir hep. Yani ekranın bazı yerlerinin düzenli bir şekilde çerçevelenmesini sağlıyor. Zaten Frame de çerçeve demek.

Ayrıca yukarıdaki örnekte olduğu gibi, kaydırılma özelliği olan bir widget olmamasına rağmen, belli bir widget grubunu içeren bir Frame, bir Canvas widgetinin create_window fonksiyonu ile ekrana yerleştirilebilir. Ve Canvas'ın içeriğini kaydıran bir kaydırma çubuğu tanımlayarak Frame'in kaydırılmasını sağlayabilirsiniz.

1 Beğeni

bu işte süper. Tam da bu aklıma gelmişti söylediklerinizden. Şimdi daha net anladım bunu. Tekrardan teşekkürler

Rica ederim. Kolay gelsin.