Çözüm GTK Stack sayfayı değiştirme

Bu konu bir çözümü açıklamaktadır. Herhangi bir çözüm açıklanmadığını düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
18 Şubat 2021
Mesajlar
477
Makaleler
1
Çözümler
4
Yer
/home/alperen
Merhaba. GTK ve Python dünyasına henüz yeni katılmış bir kişiyim. Glade ile 2 sayfalı bir uygulama tasarımı yaptım. Bu tasarımdaki "İleri" tuşuna basıldığı zaman 2. sayfaya geçiş yapsın istiyorum.

Programın kaynak kodu şu şekilde:

main.py:
#!/usr/bin/env python3

import sys

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gio

from MainWindow import MainWindow

class Uygulama(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args,
            application_id="org.yapboz.stackdemo",
            flags=Gio.ApplicationFlags.FLAGS_NONE,
            **kwargs)

    def do_activate(self):
        self.window = MainWindow(self)

app = Uygulama()
app.run(sys.argv)

MainWindow.py:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gio


class MainWindow:
    def __init__(self, app):
        self.builder = Gtk.Builder()
        self.builder.add_from_file("MainWindow.glade")
        self.builder.connect_signals(self)

        self.window = self.builder.get_object("window")
        self.window.set_application(app)

        self.window.show_all()

        self.stack = self.builder.get_object("stack") # Bu projedeki GTK Stack

    def on_btn_next_clicked(self, button):
        # Bu da bahsettiğim düğme.
        print("Bu kısmı yapamadım.")

MainWindow.glade:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow" id="window">
    <property name="can-focus">False</property>
    <child>
      <object class="GtkStack" id="stack">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="margin-start">60</property>
        <property name="margin-end">60</property>
        <property name="margin-top">20</property>
        <property name="margin-bottom">20</property>
        <property name="transition-type">slide-left-right</property>
        <child>
          <object class="GtkBox" id="page1">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="halign">center</property>
            <property name="valign">center</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkLabel">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="label" translatable="yes">Selamun aleyküm</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="btn_next">
                <property name="label" translatable="yes">İleri</property>
                <property name="visible">True</property>
                <property name="can-focus">True</property>
                <property name="receives-default">True</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="margin-start">10</property>
                <property name="margin-end">10</property>
                <property name="margin-top">10</property>
                <property name="margin-bottom">10</property>
                <signal name="clicked" handler="on_btn_next_clicked" swapped="no"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="name">page0</property>
            <property name="title" translatable="yes">page0</property>
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="page2">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="halign">center</property>
            <property name="valign">center</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkLabel">
                <property name="visible">True</property>
                <property name="can-focus">False</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="label" translatable="yes">Ve aleyküm selam</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="btn_kapat">
                <property name="label" translatable="yes">Kapat</property>
                <property name="visible">True</property>
                <property name="can-focus">True</property>
                <property name="receives-default">True</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="margin-start">10</property>
                <property name="margin-end">10</property>
                <property name="margin-top">10</property>
                <property name="margin-bottom">10</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">2</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="name">page1</property>
            <property name="title" translatable="yes">page1</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
    <child type="titlebar">
      <object class="GtkHeaderBar">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="title" translatable="yes">Sayfalar!</property>
        <property name="subtitle" translatable="yes">Henüz tamamlanmadı.</property>
        <property name="show-close-button">True</property>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>

Çözüm:

Glade uygulamasını başlatın. Dosyamızı açtıktan sonra sayfalardaki box'ı bu şekilde seçin ve paketleme sayfasına gelin. Sonra belirtilen yerde tüm sayfalarımıza ad verin ve kaydedip çıkın.

1.png


Sonra MainWindow.py dosyasında geçiş yapmasını istediğiniz yere gerekli yerleri düzenleyerek şu satırı ekleyin:
Python:
self.stack_adi.set_visible_child_name("sayfaadi")
 
Son düzenleme:
Yukarı