2016-12-09 312 views
-1

我想通過一個按鈕在Python中重新加載Tkinter窗口,但我很難搞清楚它。你會發現,它使用import random並隨機生成來自列表的單詞,當你點擊按鈕時,我想將標籤設置爲不同的單詞,就像滾動的骰子,但用單詞。如何在Python中「刷新」Tkinter窗口?

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

感謝提前的幫助:)

+1

請閱讀https://stackoverflow.com/help/mcve。示例代碼太長了。需要少於20行來說明問題和解決方案。無論如何,按鈕功能應該隨機重置顯示的值。如何做到這一點取決於小部件。你從來沒有說過你確切的問題是什麼讓你不這樣做。 –

+1

注意:我並不是建議您在計算機上清除代碼,而是建立一個旨在學習某個特定事物的新文件。如果您在嘗試上述指南後仍然有疑問,那麼我建議您使用新的,更短,更專注的代碼替換此處發佈的代碼。我不斷編寫和測試與我工作的基於tkinter的模塊不同的簡短代碼片段。 –

+0

你說你想要改變按鈕點擊後標籤的內容,但沒有嘗試在你的代碼。更改標籤的文字是微不足道的。那裏有很多例子。請先看看那些,試試看,然後用[MCVE]提問你的問題。 – Lafexlos

回答

0

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() 
+0

謝謝你完美的作品。我仍然對python很陌生,所以這對我來說是非常棒的知識。再次感謝您的幫助。 – Gravitydog061