2016-03-27 12 views
2

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.

+0

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

+0

@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! –

cevap

0

AddTab örneği oluşturan kodu gösterme. Nasıl denir? Ayrıca, tuşa basıldığında komut için AddTab'da bir addnewcategory() işlevine sahip olmanız gerekir. Bu kod, bunun nasıl yapıldığını göstermek için sınıfın dışından bir düğme ekler ve her ADDNEWCATEGORY düğmesini tıkladığınızda yeni bir düğme ekler. Açıkçası bu, diğer kodlarınızdan hiçbirini içermediğinden değil, düğmeye basmanın nasıl çalıştığını gösterir.

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') 

     ## separate frame for Add To Category button so 
     ## new buttons can be added to self.frame in order 
     self.cat_button_frame=tk.Frame(self.master) 

     self.label = tk.Label(self.master, text = 'ADD TO CATEGORY') 
     self.label.pack(anchor = 'n') 

     self.frame.pack() 
     self.cat_button_frame.pack() 
     self.but_num=1 
##  catnames = open('categorynames.txt','r').read().splitlines() 

     for name in ['a', 'b', 'c']: 
      addbutton = tk.Button(self.frame, text = '%s-%s ' %(self.but_num, name), 
            width = 20) 
      addbutton.pack() 
      self.but_num += 1 

     addnewcat = tk.Button(self.cat_button_frame, text = 'ADD NEW CATEGORY', 
        width = 100, command = self.addnewcategory) 
     addnewcat.pack(anchor = 's') 

    def addnewcategory(self): 
     """ for simplicity, new category is named "new cat" 
      and the button is not connected to any function 
     """ 
     tk.Button(self.frame, text = 'new cat-%d' %(self.but_num), width = 20).pack() 
     self.but_num += 1 

master=tk.Tk() 
AT=AddTab(master) 
## add new category from outside the class 
AT.addnewcategory() 
master.mainloop() 
İlgili konular