Два случайных значения из списка должны совпадать с изображениями - PullRequest
0 голосов
/ 30 сентября 2018

Справочная информация: У меня есть небольшая функция в приложении Tkinter, которая рандомизирует два случайных значения из списка и печатает их в GUI.Но я изо всех сил пытаюсь получить правильное изображение (логотип команды) со случайным значением.

Цель: - это случайное название команды (из списка 28 команд), и в графическом интерфейсе должен также отображаться логотип команды,Нажав кнопку «RANDOM», вы получите Team1 и Team2, и у обоих должны появиться логотипы следующих текстов.

enter image description here

Я провел исследование о: У меня было время с этим ответом, но я не мог понять его.Это игра в кости вроде как, но мне нужно два значения вместо одного, и мой список полон строк.

Пример: https://stackoverflow.com/a/27913052/5132305

import random
import tkinter as tk
from PIL import ImageTk, Image

 # Use a class that hold all Team data
class Team():
   def __init__(self, name, img_filename):
    self.name = name
    self.img_filename = img_filename

   @property
   def image(self):
    # TODO: Open image file and return .PhotoImage object
    team_logo = Image.open("%s.jpg" % (self.img_filename))
    render = ImageTk.PhotoImage(team_logo)
    self.img_filename.image = render
    return self.img_filename

   #This is how the class prints
   def __str__(self):
    return "Name: {} Image:{}".format(self.name, self.img_filename)


class MainWindow(tk.Frame):
      def __init__(self, parent, *args, **kwargs):
       tk.Frame.__init__(self, parent,  *args, **kwargs)
       root.geometry("700x450")
       text_1 = tk.Label(text="VS", fg="red", anchor="center")
       text_1.place(relx=.5, rely=.5, anchor="center")
       text_2 = tk.Label(text="RANDOM GAME", fg="green", anchor="n")
       text_2.pack(side="top")

       # Button for randomize
       self.parent = parent
       self.frame = tk.Frame(self.parent)
       self.randomButton = tk.Button(self.frame, text = 'RANDOM', 
       command=self.genRanTeam)
       self.randomButton.pack(side="bottom")
       self.frame.pack(side="bottom")

       self.home_name = tk.StringVar()
       self.visitor_name = tk.StringVar()

       if 0: # TODO: Implement Team.image
           # Images, I should somehow use this with home/visitor label?
           # Yes, look at TODO in def genRanTeam(...

           load = Image.open("%s.jpg" % (self.home.image))
           render = ImageTk.PhotoImage(load)
           # ONLY, if you decide to use OWN Label for Image
           # What you suggest for this? So if I decide to only use home/visitor labels, I don't need next 4 lines of code (after this text?)
           self.team_logo = tk.Label(parent, image=render)
           self.team_logo.image = render
       else:
           self.team_logo = None


       # Home team
       self.home_label = tk.Label(Image = self.team_logo, textvariable=self.home_name) 
       self.home_label.pack(side="left")
       # Visitor team
       self.visitor_label = tk.Label(Image = self.team_logo, textvariable=self.visitor_name) 
       self.visitor_label.pack(side="right")

       self.__init__Teams()

      # Hold this in a own function for brevity
      def __init__Teams(self):
        self.teams = [Team('Chicago Fire', 'chicago'), Team('New York \
        Red Bulls', 'newyork'), Team('Philadelphia Union', 'phila'), 
        Team('Toronto FC', 'toronto')]
        # Init defaults
        self.home = self.teams[0]
        self.visitor = self.teams[0]

      def genRanTeam(self):
        # Use the initalized Teams from MainWindow..__init__
        self.__init__Teams()
        self.home = random.choice(self.teams)
        self.visitor = None
        # Loop while home == visitor
        while self.visitor is None or self.home.name is self.visitor.name:
         self.visitor = random.choice(self.teams)

        self.home_name.set(self.home.name)
        self.visitor_name.set(self.visitor.name)   

        # TODO: Configure .team_label with Team.image
        # self.home_label.configure(image=self.home.image)
        self.home_label.configure(image=self.home.image)
        self.visitor_label.configure(image=self.visitor.image)

if __name__ == "__main__":
         root = tk.Tk()
         main = MainWindow(root)
         main.pack(side="top", fill="both", expand=True)
         root.mainloop()

Теперь, когда я нажимаю RANDOM-кнопку, он правильно выбирает случайные значения переменных x & y из списка.

У меня также есть 28 изображений в папке project / images.Все изображения: "team_name.jpg"

Вопрос 1: Как сделать цикл в списке и сопоставить название и логотип команды?

Вся помощь приветствуется и некоторый кодобзор был бы отличным!(Первый вопрос в SO!)

1 Ответ

0 голосов
/ 06 октября 2018

Комментарий : внедрить Team.image

Запуск вашего Team.image дает мне:

self.img_filename.image = render
AttributeError: 'str' object has no attribute 'image'

Вы не можете добавить новый атрибут в объект buildin str.Это будет работать, измените на:

self.render = ImageTk.PhotoImage(team_logo)
return self.render

Комментарий : Нужно ли мне сделать еще один ярлык для имиджа команды?

В этом нет необходимости, это зависит от желаемого макета.
Начните с one tk.Label(self, image=image, textvariable=name)
Это выглядит так:
enter image description here Соответствует: label-on-top-of-image-in-python

Комментарий : Возможно ли, чтоself.visitor может показать команду + логотип?

Не функция class Team() показывать что-либо, это работа tk.Lable(....
Релевантно: update-tkinter-label-with-an-image


Вопрос : два случайных значения из списка должны совпадать с изображениями

Этот подход не используйте два списка, он определяет оба значения (название команды, имидж команды) в одном классе.Поэтому совпадение не требуется.
Например:

# Use a class that hold all Team data
class Team():
    def __init__(self, name, img_filename):
        self.name = name
        self.img_filename = img_filename

    # This is how the class prints
    def __str__(self):
        return "Name: {} Image:{}".format(self.name, self.img_filename)

class MainWindow(tk.Frame):
    def __init__(self, parent, *args, **kwargs):

        # Up to 28 teams - Defined in __init__ only once
        # Create a list with all Teams using class Team
        self.teams = [Team('Chicago Fire', 'logo1.jpg'), Team('New York Red Bulls', 'logo2.jpg'), Team('Philadelphia Union', 'logo3.jpg'), Team('Toronto FC', 'logo4')]
        # Init defaults
        self.home = self.teams[0]
        self.visitor = self.teams[0]

    def genRanTeam(self):
        # Use the initalized Teams from __init__
        self.home = random.choice(self.teams)

        self. visitor = None
        # Loop while home == visitor
        while self.visitor is None or self.home is self.visitor:
            self.visitor = random.choice(self.teams)

if __name__ == "__main__":
    import time

    root = tk.Tk()
    main = MainWindow(root)
    for _ in range(3):
        main.genRanTeam()
        print("home:{} :\tvisitor:{}".format(main.home, main.visitor))
        time.sleep(1)

Выход :

home:Name: Toronto FC Image:logo4 : visitor:Name: Chicago Fire Image:logo1.jpg
home:Name: New York Red Bulls Image:logo2.jpg : visitor:Name: Toronto FC Image:logo4
home:Name: Toronto FC Image:logo4 : visitor:Name: New York Red Bulls Image:logo2.jpg

Протестировано с Python: 3.4.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...