【问题标题】:Unable to link Classes and Tkinter in python 3.2无法在 python 3.2 中链接类和 Tkinter
【发布时间】:2014-03-31 06:18:37
【问题描述】:

这是我的代码:

from tkinter import *

class Car:

    def __init__(self, car_id, name, num_seats, available):

        self.car_id = car_id
        self.name = name
        self.num_seats = num_seats
        self.available = available
        available_cars.append(self.name)


    def hire_car(self):
        self.available = False
        booked_cars.append(self.name)
        available_cars.remove(self.name)



    def return_car(self):
        self.available = True
        booked_cars.remove(self.name)
        available_cars.append(self.name)

    def display():
        pass

class Carlist:

    def __init__(self, available_cars):

        self.available_cars = available_cars

    def addCar():
        pass

    def displayAvailable():
        print(available_cars)


    def displayBooked():
        print(booked_cars)


booked_cars = []
available_cars = []

Car(1,"Suzuki Van", 2, True)
id2 = Car(2,"Toyota Corolla", 4, True)
id3 = Car(3,"Honda Crv", 4, True)
id4 = Car(4,"Suzuki Swift", 4, True)
id5 = Car(5,"Mitsibishi Airtrek", 4, True)
id6 = Car(6,"Nissan DC Ute", 4, True)
id7 = Car(7,"Toyota Previa", 7, True)


Car.hire_car(id3)


Carlist.displayAvailable()
Carlist.displayBooked()


#Interface Code

root = Tk()
root.title("Car Booking System")



frameTop = Frame(root)
frameLeft = Frame(root)
frameRight = Frame(root)
frameBottom = Frame(root)

#Top
topLabel = Label(frameTop, text = "Car Booking System", font = 20).pack()

#Right Side
bookLabel = Label(frameRight, text = "Book:").pack()

varSelectedCar = StringVar()
varSelectedCar.set(available_cars[0])
optionHire = OptionMenu(frameRight, varSelectedCar, *available_cars).pack()

buttonHireCar = Button(frameRight, text = "Enter", command = Car.hire_car).pack()

#Left Side
returnLabel = Label(frameLeft, text = "Return:").pack()

varSelectedCar2 = StringVar()
varSelectedCar2.set(booked_cars[0])
optionReturn = OptionMenu(frameLeft, varSelectedCar2, *booked_cars).pack()

buttonHireCar2 = Button(frameLeft, text = "Enter", command = Car.hire_car).pack()
#Bottom
summaryLabel = Label(frameBottom, text = "Summary:").pack()



#INITIALISATION
frameTop.pack(side = TOP)
frameLeft.pack(side = LEFT)
frameRight.pack(side = RIGHT)
frameBottom.pack(side = BOTTOM)
root.mainloop()

我正在尝试将列表链接到 GUI 界面,因此当单击 Enter 时,它会运行 hire_carreturn_car 并将它们的名称添加到相关列表中。知道怎么做吗?非常感谢您的帮助。

总的想法是有一个可以预订和还车的程序,并在底部作为摘要......

【问题讨论】:

  • 请注意,ttk.Combobox 是比 OptionMenu 更新的 UI 元素。 from tkinter.ttk import * 可以让你使用combo = Combobox(parent)combo['values'] = ["thing1","thing2"] 让你设置选择列表。

标签: python class python-3.x tkinter


【解决方案1】:

虽然这个网站不是给别人做作业的,但你今天很幸运。但是,请尝试弄清楚它是如何工作的。如何更新 OptionMenu 信息来自HERE

from collections import namedtuple
from tkinter import *

Car = namedtuple('Car', 'name num_seats')

class CarList:

    ID = 0

    def __init__(self):
        self.cars, self.hired = {}, set()

    def add_car(self, car):
        self.cars[self.ID] = car
        self.ID += 1

    def available_cars(self):
        '''Returns the list of (id, Car) tuples sorted by Car.'''
        return sorted(((car, id)
            for id, car in self.cars.items()
            if id not in self.hired))

    @staticmethod
    def labels(cars_seq):
        return ['{} [{}]'.format(t[0].name, t[1])
            for t in cars_seq]

    def hire_car(self, id):
        if id in self.hired:
            raise ValueError('That car is already hired.')
        self.hired.add(id)

    def hired_cars(self):
        return sorted(((self.cars[id], id)
            for id in self.hired))

    def return_car(self, id):
        if id not in self.hired:
            raise ValueError('That car is not even hired.')        
        self.hired.remove(id)

def add_car(car):
    if not isinstance(car, Car):
        raise TypeError('Invalid car object.')
    carlist.add_car(car)
    update_optionmenus()

def hire_car():
    label = opt_hire.var.get()
    if label:
        id = int(label.rsplit(maxsplit=1)[-1][1:-1])
        carlist.hire_car(id)
        update_optionmenus()

def return_car():
    label = opt_return.var.get()
    if label:
        id = int(label.rsplit(maxsplit=1)[-1][1:-1])
        carlist.return_car(id)
        update_optionmenus()

def _update_optionmenu(opt_menu_widget, car_seq):
    cars = carlist.labels(car_seq)
    if cars:
        opt_menu_widget.var.set(cars[0])
    else:
        opt_menu_widget.var.set('')
    opt_menu_widget['menu'].delete(0, END)
    for lab in cars:
        opt_menu_widget['menu'].add_command(label=lab,
            command=lambda lab=lab: opt_menu_widget.var.set(lab))

def update_optionmenus():
    _update_optionmenu(opt_hire, carlist.available_cars())
    _update_optionmenu(opt_return, carlist.hired_cars())    

# You have to initiate a carlist to make it work.
carlist = CarList()

#Interface Code
root = Tk()
root.title('Car Booking System')
frame_top = Frame(root)
frame_top.pack(side = TOP)
frame_left = Frame(root)
frame_left.pack(side = LEFT)
frame_right = Frame(root)
frame_right.pack(side = RIGHT)
frame_bottom = Frame(root)
frame_bottom.pack(side = BOTTOM)

#Top
label_top = Label(frame_top, text = 'Car Booking System',
    font = 20).pack()

#Right Side
label_hire = Label(frame_right, text = 'Book:', width=25).pack()
gui_var_hire = StringVar()
opt_hire = OptionMenu(frame_right, gui_var_hire, 'anything')
opt_hire.var = gui_var_hire
del gui_var_hire
opt_hire.pack()     
button_hire = Button(frame_right, text = 'Enter',
    command = hire_car).pack()

#Left Side
label_return = Label(frame_left, text = 'Return:', width=25).pack()
gui_var_return = StringVar()
opt_return = OptionMenu(frame_left, gui_var_return, 'anything')
opt_return.var = gui_var_return
opt_return.pack()
del gui_var_return  
button_return = Button(frame_left, text = 'Enter',
    command = return_car).pack()

#Bottom
label_summary = Label(frame_bottom, text = 'Summary:').pack()

add_car(Car('Suzuki Van', 2))
add_car(Car('Toyota Corolla', 4))
add_car(Car('Honda Crv', 4))
add_car(Car('Suzuki Swift', 4))
add_car(Car('Mitsibishi Airtrek', 4))
add_car(Car('Nissan DC Ute', 4))
add_car(Car('Toyota Previa', 7))
add_car(Car('Honda Crv', 2))
root.mainloop()

【讨论】:

  • 不只是编写要复制和粘贴的代码,如果您描述您所做的事情与问题中的内容不同,您的答案会更好。
  • 嗯,我通常会这样做。然而,有时我更喜欢写代码而不是写代码。在这里我可以写很多。我应该为自己保留代码。下次我会这样做。您可以编写自己的伙伴,而不是对我的回答投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多