Marquee (yukarıdan aşağı kayan yazı)

nette bunun örnek komutları var lakin aralara açıklamalarıneyin nasıl olduğuyla açıklama yapabiliecek arkadaşlar varsa çok memnun olurum…

from tkinter import *

root = Tk()

text="Lorem Ipsum"

text = (' '*20) + text + (' '*20)

marquee = Text(root, height=1, width=20)
marquee.pack()

i = 0

def command(x, i):
    marquee.insert("1.1", x)
    if i == len(text):
        i = 0
    else:
        i = i+1
    root.after(100, lambda:command(text[i:i+20], i))

command(text[i:i+20], i)

root.mainloop()


```
ben bir class içerisinde yapıcam bunu ,öncelikle class için nasıl revize edevbiliriz?

Aslında özyinelemeli fonksiyın kullandığı için devamlı bir döngü söz konusu . RAM için sorun yaratmasın.

class ile hazırlanmış benzerini buldum. aynı mantıkla yapılmış.

import tkinter as tk

class Marquee(tk.Canvas):
    def __init__(self, parent, text, margin=2, borderwidth=1, relief='flat', fps=30):
        tk.Canvas.__init__(self, parent, borderwidth=borderwidth, relief=relief)
        self.fps = fps

        # start by drawing the text off screen, then asking the canvas
        # how much space we need. Use that to compute the initial size
        # of the canvas. 
        text = self.create_text(0, -1000, text=text, anchor="w", tags=("text",))
        (x0, y0, x1, y1) = self.bbox("text")
        width = (x1 - x0) + (2*margin) + (2*borderwidth)
        height = (y1 - y0) + (2*margin) + (2*borderwidth)
        self.configure(width=width, height=height)

        # start the animation
        self.animate()

    def animate(self):
        (x0, y0, x1, y1) = self.bbox("text")
        if x1 < 0 or y0 < 0:
            # everything is off the screen; reset the X
            # to be just past the right margin
            x0 = self.winfo_width()
            y0 = int(self.winfo_height()/2)
            self.coords("text", x0, y0)
        else:
            self.move("text", -1, 0)

        # do again in a few milliseconds
        self.after_id = self.after(int(1000/self.fps), self.animate)

root = tk.Tk()
marquee = Marquee(root, text="Hello, world", borderwidth=1, relief="sunken")
marquee.pack(side="top", fill="x", pady=20)

root.mainloop()

çok önemli bir veri değilse bence gif yapıp yerleştirmekte bir formül…

Benim amaçlarımdan biri nasıl yapıldığına dair mantığı da anlamak…Bu bağlamda destek olur musunuz?

Belki şuradaki cevaplar yardımcı olabilir: https://python-forum.io/Thread-Tkinter-scrolling-text-in-tkinter
Bunun dışında bunu kendiniz, scrolledtext pencere aracı oluşturup bunu after ve yview_moveto metodlarını kullanarak belirli aralıklarda aşağı kaydırarak da yapabilirsiniz.

Mantığını anlatmak gerekirse : metnin önüne ve ardına 20’er boşluk koyuyor. Fonksiyona verinin 0. Elemanindan 20. Elemana olan kısmı gönderiyor. Fonksiyon gelen değeri bastırıyor ve i’yi 1 artırıp kendisini tekrar çağırıyor. İ her seferde 1 attığı için metin başından birer index esilerek bastırılır.

pencere üzerinde istediğim yere koyamıyorum, sadece dikey ierliyor…place olarak nasıl konumlandırırım?

place olarak kullanman için pack kaldırman gerekiyor galiba.

marquee.place(relx=0.5, rely=0.5, anchor='center')

aşağı yukarı sağ sol yerleşimi anchor hallediyor.
x ve y değerleride mevcut
şöyle bir grafik yardımcı olacaktır. anchor parametreleri:

Zamanında bir modül yazmıştım Tkinter için. Onu github üzerine yükledim şimdi. Sadece Python2 için geçerlidir. Örnek bir programı yanında yazdım. Birkaç tane de bonus var :slight_smile:

Örnek bir gif

com-gif-maker(1)

edit: şimdi artık istenilen yöne doğru kaydırma yapılabiliyor!

lr > soldan sağa
rl > sağdan sola
tb > yukarıdan aşağı
bt > aşağıdan yukarı

2 Beğeni

Harika! Güzel fikir hoşuma gitti kullansam sorun olur mu?

1 Beğeni

Lisans özgür, istediğiniz gibi kullanabilirsiniz :smiley:

1 Beğeni

Çok teşekkür ederim :slightly_smiling_face:

1 Beğeni

python 3 için nasıl kullabilirm bunu?

Bazı noktaları değiştirmeniz yeterli sanırım.

yo direk modül yok,tklive diye modül tanımlamıyor…eklentiler içerisinde de yok

Python3.4 sürümü ile denedim. Bir sıkıntı yok. Eklentiler de kodun içerisinde dikkatli bakarsanız görürsünüz. Hatta siz sadece şu kısmı kodunuza ekleyin yeter.

class Marquee:
    def __init__(self,pencere,nesne,direction = "tb"):
        # direction:
        # tb > top - bottom
        # bt > bottom - top
        # lr > left - right
        # rl > right - left

        self.directing = {"tb":lambda nesne:[nesne.winfo_x(),nesne.winfo_y()+1],
                          "bt":lambda nesne:[nesne.winfo_x(),nesne.winfo_y()-1],
                          "lr":lambda nesne:[nesne.winfo_x()+1,nesne.winfo_y()],
                          "rl":lambda nesne:[nesne.winfo_x()-1,nesne.winfo_y()]}
        
        self.pencere = pencere
        self.pencere.update()
        
        self.nesne = nesne
        self.nesne.update()

        if(direction not in self.directing):
            self.direction = "tb"
        else:
            self.direction = direction

        self.nesne.after(1,self.hareket)

    def hareket(self,event = None):
        y = self.nesne.winfo_y()

        if(self.direction[0] == "t"):
            if(self.nesne.winfo_y() > self.pencere.winfo_height()):
                self.nesne.place(x = self.nesne.winfo_x(),y = -(self.nesne.winfo_height()))
                self.nesne.after(10,self.hareket)
            else:
                i = self.directing[self.direction](self.nesne)
                self.nesne.place(x = i[0],y = i[1])
                self.nesne.after(10,self.hareket)
        elif(self.direction[0] == "b"):
            if(self.nesne.winfo_y() < 0):
                self.nesne.place(x = self.nesne.winfo_x(),y = self.pencere.winfo_height()+self.nesne.winfo_height())
                self.nesne.after(10,self.hareket)
            else:
                i = self.directing[self.direction](self.nesne)
                self.nesne.place(x = i[0],y = i[1])
                self.nesne.after(10,self.hareket)            
        elif(self.direction[0] == "l"):
            if(self.nesne.winfo_x() > self.pencere.winfo_width()):
                self.nesne.place(x = -self.nesne.winfo_width(),y = self.nesne.winfo_y())
                self.nesne.after(10,self.hareket)
            else:
                i = self.directing[self.direction](self.nesne)
                self.nesne.place(x = i[0],y = i[1])
                self.nesne.after(10,self.hareket) 
        else:
            if(self.nesne.winfo_x() < -(self.nesne.winfo_width())):
                self.nesne.place(x = self.pencere.winfo_width()+self.nesne.winfo_width(),y = self.nesne.winfo_y())
                self.nesne.after(10,self.hareket)
            else:
                i = self.directing[self.direction](self.nesne)
                self.nesne.place(x = i[0],y = i[1])
                self.nesne.after(10,self.hareket)            

Kullanımı da şu şekilde

Marquee(pencere_adi,yazi,direction = "tb")

Sadece belirli bir alan üzerinden gidip gelmesini istiyorum…ona dair çözümünüz var mı?

Malesef biraz uğraşmanız gerekiyor, aksi takdirde bu işin sonu gelmez. Hatta benim size bu konuda sadece nasıl yapmanız gerektiğine dair ipucu verip mantığını anlatmam gerekirdi. Ancak elimde hazır kod vardı ve paylaştım…

Biraz algoritmanızı zorlayıp kendinizi geliştirmeniz gerekiyor. Aradığınız herşey internette yoktur, bu yüzden biraz kendiniz çözüm üretmeye çalışmalısınız.

Kolay gelsin.

1 Beğeni

Haklsınız teşekkür ederim…:slight_smile:

1 Beğeni

Bu projeyi pypi.org a eklemeyi düşündünüz mü? @coderistan

1 Beğeni

Aslında sadece kendim için yazmıştım, yayınlama gibi bir düşüncem yoktu. Ama proje, katkılarla beraber geliştirilirse neden olmasın?

2 Beğeni