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…
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.
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
Örnek bir gif
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ı
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)
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.