2015-12-15 53 views
4

我真的需要一些代码的帮助。我不指望你为我写这篇文章,因为这是一个学校项目,但我真的很迷茫,需要帮助。Python Tkinter。如何通过标签中的按钮存储条目

我写的代码是某种生产系统。
它并不需要真正能够在任何地方发送任务,因为这只是一个想象的场景。

代码必须包含三个文件:data.py,model.py和gui.py.

  • 桂可以访问其他两个文件
  • 数据只能访问模型
  • 型号不能访问另外两个任。

我的老师写了一些我继续写的代码。有些文字是丹麦文,但大多数评论都是英文的。代码如下: 代码如下。

data.py

from model import * 

class Data(object): 

def __init__(self): 
    self.units = [] 
    self.finished_tasks = [] 

def __str__(self): 
    result = "These tasks have been finished: " 
    for i in self.finished_tasks: 
     result += str(i) 
    return result 

def task_done(self, unit): 
    done_task = unit.task_done() 
    if done_task != None: 
     #TODO: add to list of finished tasks 
     pass 

def add_task(self, name, amount, unit): 
    s = Springroll_task(name, amount) 
    unit.add_to_queue(s) 

def read_from_database(self):#doesn't actually read from db.. 
    self.units.append(Production_unit("maskine1")) 
    self.units.append(Production_unit("maskine2")) 

    self.add_task("Miniruller", 100, self.units[0]) 
    self.add_task("Maxiruller", 200, self.units[0]) 
    self.add_task("HowIRoll", 3000, self.units[0]) 
    self.add_task("RulleMarie", 40, self.units[1]) 
    self.add_task("Rullesten", 500, self.units[1]) 
    self.add_task("Toiletpapirsruller", 6000, self.units[1]) 

model.py

class Springroll_task(object): 

    def __init__(self, name, amount): 
     self.name = name 
     self.amount = amount 

    def __str__(self): 
     return self.name + " " + str(self.amount) 


class Production_unit(object): 

    def __init__(self, amount={}, name={},): 
     #name of the production unit 
     self.name = name 
     self.amount = amount 
     #the current task 
     self.current_task = None 
     #the tasks in the queue 
     self.springroll_queue = [] 
     #the size of the queue 
     self.queue_size = 0 

    def __str__(self): 
     #TODO 
     return self.name + " " + str(self.amount) 

    def add_to_queue(self, task={}): 
     if self.current_task == None: 
      self.current_task = task 
     else: 
      self.springroll_queue.append(task) 
      self.queue_size += 1 
      #remember to update queue_size 
      pass 

    def task_done(self): 
     #TODO: remember the old current task. 
     #Set the current task to be the first in the queue (and remove from queue) 
     # - if there is a task in the queue. 
     #return the old current task. 
     #remember to update queue_size 
     self.queue_size -= 1 
     pass 

gui.py

from tkinter import * 
from model import * 
from data import Data 

class Application(Frame): 
    def __init__(self, master, unit): 
     self.mod = Production_unit() 
     super(Application, self).__init__(master) 
     self.grid() 
     self.unit = unit 
     self.create_widgets() 



    def create_widgets(self): 
     self.unit_name_lbl = Label(self, text = self.unit.name) 
     self.unit_name_lbl.grid(row = 0, column = 0, columnspan = 2, sticky = W) 

     self.cur_prod_lbl = Label(self, text = "produktion nu: ") 
     self.cur_prod_lbl.grid(row = 1, column = 0, columnspan = 2, sticky = W) 

     self.prod_lbl = Label(self, text = "produkt") 
     self.prod_lbl.grid(row = 2, column = 0, sticky = W) 

     self.amount_lbl = Label(self, text = "antal") 
     self.amount_lbl.grid(row = 2, column = 1, sticky = W) 
     #Label for production now 
     self.amount1_lbl = Label(self, text = "    ", bg ="red") 
     self.amount1_lbl.grid(row = 3, column = 0, sticky = W) 

     self.amount2_lbl = Label(self, text = "  ", bg ="red") 
     self.amount2_lbl.grid(row = 3, column = 1, sticky = W) 
     #Button for task finished 
     self.finished_but = Button(self, text = "Opgave afsluttet", bg ="pink", command=self.mod.task_done) 
     self.finished_but.grid(row = 3, column = 2, sticky = W) 

     #Label for queue 
     self.queue_lbl = Label(self, text = "Kø") 
     self.queue_lbl.grid(row = 4, column = 0, sticky = W) 
     #Label for production queue 
     for i in range(0,3): 
      self.name_lbl =Label(self, text = self.mod.springroll_queue, bg="red", width= 6) 
      self.name_lbl.grid(row = 5+i, sticky = W) 

     for j in range(0,3): 
      self.qt_lbl =Label(self, text = self.mod.springroll_queue, bg="red", width= 4) 
      self.qt_lbl.grid(row = 5+j, column = 1) 

     self.new_lbl = Label(self, text = "Ny") 
     self.new_lbl.grid(row = 10, column = 0, sticky = W) 
     #Entry for entries 
     self.eq1_ent = Entry(self, text = "", width=6) 
     self.entry_name = self.eq1_ent.get() 
     self.eq1_ent.grid(row = 11, sticky = W) 

     self.ea1_ent = Entry(self, text = "", width=4) 
     self.ea1_ent.grid(row = 11, column = 1, sticky = W) 
     #Button for add to queue 
     self.add_but = Button(self, text = "Tilføj til kø", bg ="pink", command=self.mod.add_to_queue(self.ea1_ent.get())) 
     self.add_but.grid(row = 11, column = 2, sticky = W) 





    def done(self): 
     d.task_done(self.unit) 
     self.redraw() 

    def add(self): 
     n = "Nyt navn" #read from gui 
     a = "Nyt antal" #read from gui 
     d.add_task(n, a, unit) 
     self.redraw() 


    def redraw(self): 
     #TODO 
     pass 

# main 
root = Tk() 
root.title("Daloon") 
root.geometry("300x300") 

d = Data() 

d.read_from_database() 

p = d.units[0] 

app = Application(root, p) 

root.mainloop() 

所以它目前看起来像这个:

我需要做的是在底部的两个入口小部件中输入一个输入,并将它们放在上面的4个标签小部件之一中,从顶部开始,然后在队列之后,这应该当我按下add_but按钮时会发生这种情况,这似乎已经消失了。
之后,当按下“Opgave afsluttet”按钮时,我需要存储在数据文件中的任务。

我真的很希望有人能够帮助我!

我编辑了一些建议,并且现在正在调用正确的self.eq1_ent.get(),我想。我不再有任何错误,现在我只是不知道如何让它做我想做的事情。 编辑2:我慢慢地得到一些东西,所以我已经在model.py和gui.py变化...... 它看起来像现在这样: image

+0

'self.eq1'没有定义。你有'self.q1_lbl'和'self.eq1_ent' – Zety

+1

当你调用'Entry.get()'它会得到那个确切时刻的内容。由于您在创建空条目后立即调用'.get()',它只会让您获得空字符串。 – Lafexlos

回答

2

self.eq1没有定义。你有self.q1_lblself.eq1_ent
要访问标签使用self.q1_lbl

为了能够将文本设置为您的标签创建它们如下:

self.var = StringVar() 
self.unit_name_lbl = Label(self, textvariable=self.var) 

例如,从redraw()可以设置'text'self.unit_name_lbl这样的:self.var.set('text')

  • 检查,如果你在d.add_task(n, a, unit)

  • 错过self当你做command=mod.add_to_queue(self.ea1_ent.get())mod.add_to_queue功能将被直接调用,如果你想通过此函数的参数,当用户按下按钮,您可以使用lambda

    command=lambda: mod.add_to_queue(self.ea1_ent.get) 
    
+0

谢谢你的回答,其他人回答说,作为评论,但删除它,所以我纠正了这一点。我仍然不知道如何将标签amount1,amount2以及所有q1-q3和a1-a3更改为我在条目中编写的内容。 –

+0

@Andreas Steiner我发现这个链接很有用http://effbot.org/tkinterbook – Zety