Tkinter listbox hakkında

tkinterle basit bir kelime oyunu yazıyodum her şey gayet iyiydi lakin penceredeki yenileme butonuna bastıktan sonra program yazılan kelimeyi kabul etmiyor kodlar biraz uzun ama yardımcı olursanız sevinirim:)

kodlar:

import tkinter as tk
import time
import random
from tkinter import messagebox
from playsound import playsound

##3#33##3#        54
class root(tk.Tk):
    dictionary = {"yere serilen şeyler":["minder", "yorgan", "halı", "kilim", "havlu"],
                  "açılan şeyler":["kutu", "kalem", "saç", "ambalaj", "kabak çiçeği"],
                  "bozulan şeyler":["insan", "yemek", "saat", "bilgisayar"]}
    wordlist = ["minder", "yorgan", "halı", "kilim", "havlu", "kutu", "kalem", "saç", "ambalaj", "kabak çiçeği", "insan", "yemek", "saat", "bilgisayar"]
    value = 1
    cevapdeger = 0
    rakipcevapdeger = 0
    kontrol = set()
    rakipkontrol = set()
    def __init__(self):
        super().__init__()
        self.iconbitmap(r"C:\Users\toshiba\Downloads\download.ico")
        self['bg'] = "purple"
        self.title("kelime oyunu")
        self.geometry("350x450")

        self.cevapkutusu = tk.Entry(width=27)
        self.cevapkutusu.place(x=84, y=427)

        self.dugme = tk.Button(text="✅",bg="yellow", fg="white", command=self.islem)
        self.dugme.place(x=253, y=423)

        self.soru = tk.Label(text=random.choice([x for x in self.dictionary.keys()]), bg="purple")
        self.soru.place(x=119, y=34)
        self.etiket = tk.Label(text="""Bot       VS       SEN""", bg="purple")

        self.etiket.place(x=119, y=1)

        self.cevapalanı = tk.Listbox(width=54, height=23)
        self.cevapalanı.place(x=10, y=53)

        self.yeniledugme = tk.Button(text="",bg="purple", command=self.yenile)
        self.yeniledugme.place(x=323, y=1)

        self.bilgidugme = tk.Button(text="i", width=2, fg="white", bg="blue", command=self.bilgiislem)
        self.bilgidugme.place(x=1, y=1)

    def rakipkontrolislem(self):
        self.cevap = self.cevapkutusu.get()
        self.dugme['state'] = "disabled"
        self.rakipcevap = random.choice(self.wordlist)

        if not self.rakipcevap in self.rakipkontrol and not self.rakipcevap in self.kontrol:

            if self.rakipcevap in self.dictionary[self.soru['text']]:
                self.cevapalanı.insert(self.value, "Bot Olric: "+"✅"+self.rakipcevap)
                self.cevapalanı.itemconfig(self.value-1, fg="green")
                self.rakipcevapdeger += 5
                self.rakipkontrol.add(self.rakipcevap)

            elif not self.rakipcevap in self.dictionary[self.soru['text']]:
                self.cevapalanı.insert(self.value, "Bot Olric: "+"✖"+self.rakipcevap)
                self.cevapalanı.itemconfig(self.value-1, fg="red")
                self.rakipcevapdeger -= 2
                self.rakipkontrol.add(self.rakipcevap)
            self.value += 1

        else:
            self.rakipkontrolislem()








    def kontrolislem(self):
        if not self.cevap in self.kontrol and not self.cevap in self.rakipkontrol:
            if self.cevap in self.dictionary[self.soru['text']]:
                self.cevapalanı.insert(self.value, "Sen: "+"✅"+self.cevap)
                self.cevapalanı.itemconfig(self.value-1, fg='green')
                self.cevapdeger += 5
                self.kontrol.add(self.cevap)

            if not self.cevap in self.dictionary[self.soru['text']]:
                self.cevapalanı.insert(self.value, "Sen: "+"✖"+self.cevap)
                self.cevapalanı.itemconfig(self.value-1, fg='red')
                self.cevapdeger -= 2
                self.kontrol.add(self.cevap)

        else:
            messagebox.showwarning("uyarı!", "{} daha önce yazıldı".format(self.cevap))
            self.value -= 1



    def islem(self):
        if self.value < 22:
            self.cevap = self.cevapkutusu.get()
            self.kontrolislem()
            self.value += 1

            if self.value%2==0:
                self.rakipkontrolislem()
            self.dugme['state']="normal"
        else:
            self.dugme['state']="disabled"   #### KAZANANIN İSMİ YAZILACAK
            self.kazanan = {self.rakipcevapdeger:"Bot Olric", self.cevapdeger:"Sen"}
            #playsound("C:/Users/toshiba/AppData/Local/Programs/Python/Python39/siuuu.mp3")
            messagebox.showinfo("Oyun Bitti", """
            Kazanan:{}
            Sen: {} puan
            Bot Olric: {} puan""".format(self.kazanan[max(self.kazanan.keys())], self.cevapdeger, self.rakipcevapdeger))
            #playsound("C:/Users/toshiba/AppData/Local/Programs/Python/Python39/siuuu.mp3")


    def rakip(self):
        self.cevap = self.cevapkutusu.get()


        self.dugme['state'] = "disabled"


        self.rakipcevap = random.choice(self.wordlist)
        if self.rakipcevap in self.dictionary[self.soru['text']]:
            self.cevapalanı.insert(self.value, "Bot Olric: "+"✅"+self.rakipcevap)
            self.cevapalanı.itemconfig(self.value-1, fg="green")
            self.rakipcevapdeger += 5

        elif not self.rakipcevap in self.dictionary[self.soru['text']]:
            self.cevapalanı.insert(self.value, "Bot Olric: "+"✖"+self.rakipcevap)
            self.cevapalanı.itemconfig(self.value-1, fg="red")
            self.rakipcevapdeger -= 2
        self.value += 1


    def yenile(self):
        self.cevapalanı.delete(0,self.value)
        self.value/=self.value
        self.soru['text']=random.choice([x for x in self.dictionary.keys()])
        self.rakipcevapdeger *= 0
        self.cevapdeger *= 0
        self.dugme['state'] = "normal"

    def bilgiislem(self):
        messagebox.showinfo("bilgi", "her doğru cevap +5puan\nher yanlış cevap -2 puan\nrakibiniz bir bot")
root().mainloop()

hata:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\toshiba\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\toshiba\Desktop\pythonproje\olricxreel.py", line 99, in islem
    self.kontrolislem()
  File "C:\Users\toshiba\Desktop\pythonproje\olricxreel.py", line 85, in kontrolislem
    self.cevapalanı.insert(self.value, "Sen: "+"✖"+self.cevap)
  File "C:\Users\toshiba\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 3197, in insert
    self.tk.call((self._w, 'insert', index) + elements)
_tkinter.TclError: bad listbox index "1.0": must be active, anchor, end, @x,y, or a number

penceredeki yenileme tuşu:
Ekran Görüntüsü (32)_LI

self.value değeri tam sayı yerine float gönderiyor. Index numaraları tam sayı olmalıdır.

def kontrolislem(self):
    self.value = int(self.value)

Fonksiyonun başına şunu eklediğimizde sorun çözülmüş görünüyor.

2 Beğeni

Burada bölme işlemi yaptığınız için float tipine dönüşüyor.
self.value = 1
yapabilirsiniz, aynı çıkıyor neticede.

2 Beğeni