【问题标题】:How to "refresh" Tkinter window in python?如何在 python 中“刷新”Tkinter 窗口?
【发布时间】:2017-04-24 11:49:15
【问题描述】:

我正在尝试通过一个按钮在 Python 中重新加载 Tkinter 窗口,但我无法弄清楚。你看,它使用import random 并从列表中随机生成单词,当你单击按钮时,我想将标签设置为不同的单词,就像掷骰子一样,但带有单词。

import random
from Tkinter import *          #don't import like this except for Tkinter
root = Tk() #create main window
root.title('Atarashi Sozo')
# Make and place a canvas widget for events and drawing
canvas = Canvas(root, height=600, width=600, relief=RAISED, bg='white')
canvas.grid() #Puts the canvas in the main Tk window

#Create lists
creature = ['is an Animal', 'is a Human', 'is an Artificial Intelligence', 
        'is an Alien', 'is a Mage','is a Reptillian','is a Shapeshifter',
        'is Undead', 'is a Scorpion Hedgehog', 'is an Angel', 'is a Demon']
element = ['controls lightning', 'controls fire', 'controls nature', 'controls water', 'controls mater', 
       'controls time', 'controls gravity', 'controls life', 'controls death', 'controls wind',
       'can bend any metal','controls the sun', 'controls the moon', 'controls love']
features = ['has wings', 'has markings', 'has large fangs', 'has claws', 'has a tail', 'has a weapon', 
        'has cybernetic parts', 'has wolf ears', 'has broken teeth', 'has a horn', 'has big ears',
        'has eyes with two colors', 'has a mp3']
wildcard = ['is cursed', 'is bewitched', 'has no soul', 'killed someone', 'just learned magic',
        'has no wifi', 'has unlimited memory', 'is poor', 'won the lottery', 'set the world on fire', 'visited another dimension']
colors = ['is primarily blue', 'is primarily grey', 'is primarily red', 'is primarily green', 'is primarily orange',
      'is secondarily blue', 'is secondarily grey', 'is secondarily red', 'is secondarily green', 'is seconarily orange',
      'is primarily black', 'is primarily purple', 'is secondarily purple', 'has all the colors of the rainbow']
handicap = ['is blind', 'is deaf', 'lost limbs', 'fears everything', 'has broken bones','has a small head','has an illness',
        'has amnesia', 'is allergic to almost everything', 'is deformed']
habitat = ['lives in cyberspace', 'lives in a desert', 'lives in the mountains', 'lives in a volcano', 'lives in grasslands',
        'lives on the moon', 'lives in space', 'lives on a deserted island', 'lives in a virtual world', 'lives in the underworld']
personality = ['is clingy', 'is depressed', 'is energetic', 'is angry', 'is kind', 'is a jerk', 'is goofy', 'is immature', 'is happy',
           'is insane']
profession = ['is a teacher', 'is an assassin', 'is a graphic designer', 'is a programmer', 'is a photographer', 'is a blacksmith',
          'is a bounty hunter', 'is an inventor', 'is a mage', 'is a monster hunter']
hobby = ['likes to cook', 'likes to draw and paint', 'likes to build things', 'likes to play games', 'likes to shop',
     'studies alchemy', 'likes to write', 'likes to make music', 'likes to design', 'likes sports']
#Sets categories to choose from
categoryList = [hobby,profession,personality,habitat,handicap,colors,wildcard,features,element]
#Removes category from list if it has been choosen to remove the possibility of duplicates
catOne = random.choice(categoryList)
if catOne in categoryList: categoryList.remove(catOne)
catTwo = random.choice(categoryList)
if catTwo in categoryList: categoryList.remove(catTwo)
catThree = random.choice(categoryList)
if catThree in categoryList: categoryList.remove(catThree)
#Chooses item from category choosen
itemOne = random.choice(catOne)
itemTwo = random.choice(catTwo)
itemThree = random.choice(catThree)

#Creates the main visual almost the same as Atarashi Sozo in App Inventor
Title_box = canvas.create_rectangle(500, 90, 100, 18, outline = 'purple',width = 10, fill = 'violet')
Title_text = canvas.create_text(300, 50, text='Your Character', font=('Impact', -50))
Display_box1 = canvas.create_rectangle(600, 200, 8, 125, outline = 'blue', width = 10, fill = 'sky blue')
Label1 = canvas.create_text(300, 160, text=random.choice(creature), font=('Impact', -30,), fill='red')
Display_box2 = canvas.create_rectangle(600, 300, 8, 225, outline = 'red', width = 10, fill = 'pink')
Label2 = canvas.create_text(300, 260, text=itemOne, font=('Impact', -30), fill='blue')
Display_box3 = canvas.create_rectangle(600, 400, 8, 325, outline = 'goldenrod', width = 10, fill = 'gold')
Label3 = canvas.create_text(300, 360, text=itemTwo, font=('Impact', -30), fill='chocolate4')
Display_box4 = canvas.create_rectangle(600, 500, 8, 425, outline = 'saddle brown', width = 10, fill = 'chocolate')
Label4 = canvas.create_text(300, 460, text=itemThree, font=('Impact', -30), fill='gold1')

#Create Button
class Outcomes(Frame):

    def __init__(self,master):
    Frame.__init__(self,master)
    self.grid()
    self.create_widgets()
    def create_widgets(self):
    self.button = Button(self, text = 'Generate Character')
    self.button['command'] = self.print_text
    self.button.grid()
    def print_text():
    print 
app = Outcomes(root)

# Enter event loop. This displays the GUI and starts listening for events.
# The program ends when you close the window.
root.mainloop() 

提前感谢您的帮助:)

【问题讨论】:

  • 请阅读stackoverflow.com/help/mcve。示例代码太长了。需要不到 20 行来说明问题和解决方案。无论如何,按钮功能应该随机重置显示的值。如何做到这一点取决于小部件。你从来没有说过你的确切问题是什么让你无法这样做。
  • 注意:我并不是建议您擦除计算机上的代码,而是建议您创建一个新文件,旨在学习一件事。如果您在尝试上述指南后仍有疑问,那么我建议您将此处发布的代码替换为新的、更短、更有针对性的代码。我不断编写和测试与我工作的基于 tkinter 的模块分开的简短的 sn-p 代码。
  • 您说您想在单击按钮后更改标签的内容,但您的代码中没有尝试这样做。更改标签的文本是微不足道的。那里有很多例子。请先看看这些,尝试一下,然后通过minimal reproducible example提出您的问题。
  • 你的意思是self.button['text'] = 'new text' 吗?如果您希望得到更好的答案,请创建小型、有效的示例代码。

标签: python tkinter reload


【解决方案1】:

Canvas 具有 itemconfig(item_id, option=new_value) 方法来更改项目选项。即。

canvas.itemconfig(creature_text, text=random.choice(creature))

简单的工作示例

try:
    from Tkinter import * # Python 2
except:
    from tkinter import * # Python 3

import random

# --- functions ---

def change_creature():
    # change text in item
    canvas.itemconfig(creature_text, text=random.choice(creature))

# --- data ---

creature = [
    'is an Animal', 'is a Human', 'is an Artificial Intelligence', 
    'is an Alien', 'is a Mage','is a Reptillian','is a Shapeshifter',
    'is Undead', 'is a Scorpion Hedgehog', 'is an Angel', 'is a Demon'
]

# --- main ---

root = Tk()

canvas = Canvas(root, height=100, width=300)
canvas.grid()

# create empty item
creature_text = canvas.create_text(10, 10, anchor='nw')

# generate first text in item
change_creature()

# use button to call the same function    
button = Button(root, text='Generate Creature', command=change_creature)
button.grid()

root.mainloop()

编辑:更通用 - 在函数中使用参数

change_text(creature_text_1, creature)

command=lambda:change_text(creature_text_1, creature))

或者直接使用(没有自己的功能)

canvas.itemconfig(creature_text_1, text=random.choice(creature))

command=lambda:canvas.itemconfig(creature_text_1, text=random.choice(creature))

代码:

try:
    from Tkinter import * # Python 2
except:    
    from tkinter import * # Python 3

import random

# --- functions ---

def change_text(item_id, all_text):
    # change text in item
    canvas.itemconfig(item_id, text=random.choice(all_text))

# --- data ---

creature = [
    'is an Animal', 'is a Human', 'is an Artificial Intelligence', 
    'is an Alien', 'is a Mage','is a Reptillian','is a Shapeshifter',
    'is Undead', 'is a Scorpion Hedgehog', 'is an Angel', 'is a Demon'
]

# --- main ---

root = Tk()

canvas = Canvas(root, height=100, width=300)
canvas.grid()

# create empty items
creature_text_1 = canvas.create_text(10, 10, anchor='nw')
creature_text_2 = canvas.create_text(10, 30, anchor='nw')

# generate first text in item
change_text(creature_text_1, creature)
# or directly 
canvas.itemconfig(creature_text_2, text=random.choice(creature))

# use buttons to call the same function    
button = Button(root, text='Generate Creature 1', command=lambda:change_text(creature_text_1, creature))
button.grid()

# or directly 
button = Button(root, text='Generate Creature 2', command=lambda:canvas.itemconfig(creature_text_2, text=random.choice(creature)))
button.grid()

root.mainloop()

【讨论】:

  • 谢谢它完美的工作。我还是 python 的新手,所以这对我来说是很好的知识。再次感谢您的帮助。
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2012-07-01
  • 2020-05-29
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多