Bir okul projesi için bir envanter sistemi oluşturmaya çalışıyorum. İnsanların yiyecek maddelerini oluşturdukları kategorilere girmelerine izin verilmesi gerekiyor.Diğer pencereyi kapattıktan sonra Tkinter'daki bir pencere nasıl güncellenir: Python 3.5
1 yemek öğesinin eklenebileceği kategorileri listeleyen pencereyi yenilemeye çalışırken güçlük çekiyorum.
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
Bu kod, mainloop anahtar değiştirme özelliği yapar.
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
Bu, AddTab penceresinde görüntülenecek yeni bir kategori ekleyen pencerenin kodudur. Ben yeni adı girdiğinizde
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
, bunun bir düğme olarak yeni kategori ile AddTab güncelleme için hariç gerekiyordu her şeyi yapar.
İnternette aradığım şeylerin çoğu, mainloop'un 'olay işleme' veya güncelleme yaptığı anlamına geldiğini söylüyor. Özellikle de gördüğüm birçok programın tüm 'widget'ları' __init__
'da varsa, bunun ne anlama geldiğinden emin değilim.
Python'u kendi başıma öğrenmeye ve terbiyeli bir şekilde ilerlemeye çalışıyorum. Bunun büyük bir kısmı muhtemelen kötü (korkunç) programlamadır ve neyin değil ama programlamadaki ilk adımdır ve öğrenmeye hazırım.
Birisi tam kod bakmak istiyorsa, ben de yayınlayabilirim.
DÜZENLEME: İşte
istendiği gibi tam kodu: temelde AddTab bir kopyası olacak şekilde
import tkinter as tk
import os
filetuple = ('categorynames', 'barcodes')
for filename in filetuple:
fileopen = open(filename+'.txt','a')
fileopen.close
catnameopen = open('categorynames.txt','r').read().splitlines()
print(catnameopen)
for categoryname in catnameopen:
print(categoryname)
categoryamt = open(categoryname+'.txt','a')
categoryamt.close
if os.stat(categoryname+'.txt').st_size == 0:
categoryedit = open(categoryname+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
else:
print("not needed")
class MainMenu:
def __init__(self, master):
self.master = master
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.frame = tk.Frame(self.master)
self.addtabbutton = tk.Button(self.frame, text = 'ADD FOOD', width = 100, command = self.addtabwindow)
self.addtabbutton.pack()
self.subtabbutton = tk.Button(self.frame, text = 'SUBTRACT FOOD', width = 100, command = self.subtabwindow)
self.subtabbutton.pack()
self.quitbutton = tk.Button(self.frame, text = 'QUIT', width = 100, command = self.closewindow)
self.quitbutton.pack()
self.frame.pack()
def closewindow(self):
self.master.destroy()
def addtabwindow(self):
self.addtabwindow = tk.Toplevel(self.master)
self.app = AddTab(self.addtabwindow)
def subtabwindow(self):
self.subtabwindow = tk.Toplevel(self.master)
self.app = SubTab(self.subtabwindow)
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
def loopstuff(self):
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
def addnewcategory(self):
self.addnewcategory = tk.Toplevel(self.master)
self.app = NewCategory(self.addnewcategory)
def addtocategory(self, name):
print(name)
nameamt = open(name+'.txt','r').read()
nameamt = int(nameamt) + 1
newamt = open(name+'.txt','w')
newamt.write(str(nameamt))
newamt.close
class SubTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'SUBTRACT FROM CATEGORY')
self.label.pack()
catnames = open('categorynames.txt','r').read().splitlines()
#for name in catnames:
#self.catnamebutton = tk.Button(self.frame, text = name, width = 30)
#self.catnamebutton.pack()
self.frame.pack()
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
alt sekmesi temelde göz ardı edilebilir.
Yüklediğiniz kodun içinde olmadığından şüpheleniyorum. Hem YeniKategori hem de “AddTab”, “Çerçeveler” dir (ayrıca, miras kullanmalısınız ... Python 3 C'mon). Soru başlığınız ("pencereler" ile ilgili) açıklar, birden çok Tk 'Uygulaması'nın olması gerekir. NewCategory’i çağıran/yapılandıran kodlarınız nerede? Muhtemelen bir yerde 'show()' gibi bir şey yapacak? – Tersosauros
@Tersosauros Tüm kodu eklemek için bu gönderiyi güncelledim. Bu projenin yanı sıra çeşitli Stackoverflow yayınları için ana kaynağım olan PythonProgramming'i kullanıyorum. Sahip olduğumu düşündüğüm sorun, eski düğmelerle birlikte yepyeni bir düğme kümesi oluşturmadan, her kategoriye karşılık gelen düğmeleri oluşturan 'for döngüsünü' tekrarlamanız gerektiğidir. Pencereyi kapatıp yeniden açarsam kod iyi çalışır. Yardımın için teşekkürler! –