2015-11-21 5 views
0

Я делаю игру в tkinter, чтобы практиковать свои навыки кодирования для будущих проектов, однако я столкнулся с камнем преткновения. Я читал в меню Tkinter, и я не могу найти способ разместить их где угодно, кроме верхней части окна. То, что я пытаюсь сделать, это сделать выпадающее поле выбора, которое позволяет вам выбрать опцию и выполнить команду на основе этой опции, но я хочу, чтобы она была помещена рядом с меткой в ​​столбце позиции сетки = 2 строки = 2. Я хотел бы знать, возможно ли это или нет, а если нет, то другой способ сделать подобное.Custom Tkinter Menu Placement

import tkinter 
import threading 
import time 
import math 
from random import randrange 

global Stage 
Stage = 0 
global Coins 
Coins = 0 
global Actions 
Actions = 0 
global ActionSpeed 
ActionSpeed = 0 
global Day 
Day = 1 
global Metal 
Metal = "None" 
global Type 
Type = "None" 
global FormLevel 
FormLevel = 0 
global Hardness 
Hardness = 0 
global Sharpness 
Sharpness = 0 
global Copper 
Copper = 0 
global Iron 
Iron = 0 


class simpleapp_tk(tkinter.Tk): 
    def __init__(self, parent): 
     tkinter.Tk.__init__(self, parent) 
     self.parent = parent 
     self.initialise() 

    def initialise(self): 

     self.grid() 
     self.resizable(False, False) 

     self.StartUp() 

    def StartUp(self): 

     #Story Section 1 
     self.labelVariableStory1 = tkinter.StringVar() 
     Story1 = tkinter.Label(self, textvariable=self.labelVariableStory1, anchor = 'w') 
     Story1.grid(column=0, row=0, sticky='EW') 
     self.labelVariableStory1.set("A great fire burned through the land two days ago.") 

     self.labelVariableStory2 = tkinter.StringVar() 
     Story2 = tkinter.Label(self, textvariable=self.labelVariableStory2, anchor = 'w') 
     Story2.grid(column=0, row=1, sticky='EW') 
     self.labelVariableStory2.set("It killed hundreds and left more homeless.") 

     self.labelVariableStory3 = tkinter.StringVar() 
     Story3 = tkinter.Label(self, textvariable=self.labelVariableStory3, anchor = 'w') 
     Story3.grid(column=0, row=2, sticky='EW') 
     self.labelVariableStory3.set("Now you walk the streets begging for money just to get by.") 

     self.labelVariableStory4 = tkinter.StringVar() 
     Story4 = tkinter.Label(self, textvariable=self.labelVariableStory4, anchor = 'w') 
     Story4.grid(column=0, row=3, sticky='EW') 
     self.labelVariableStory4.set("This is the start of your journey.") 


     Story1.after(15000, lambda: Story1.destroy()) 
     Story2.after(15000, lambda: Story2.destroy()) 
     Story3.after(15000, lambda: Story3.destroy()) 
     Story4.after(15000, lambda: Story4.destroy()) 
     self.after(15000, lambda: self.New_Day()) 

    def New_Day(self): 
     global Coins 
     global Actions 
     global ActionSpeed 
     global Copper 
     global Iron 
     Actions = 5 + ActionSpeed 

     #Basic Information Labels 
     self.labelVariableInfo1 = tkinter.StringVar() 
     Info1 = tkinter.Label(self, textvariable=self.labelVariableInfo1, anchor = 'e') 
     Info1.grid(column=0, row=0, sticky='EW') 
     self.labelVariableInfo1.set("Coins:") 

     self.labelVariableInfo2 = tkinter.StringVar() 
     Info2 = tkinter.Label(self, textvariable=self.labelVariableInfo2, anchor = 'w') 
     Info2.grid(column=1, row=0, sticky='EW') 
     self.labelVariableInfo2.set(Coins) 

     self.labelVariableInfo3 = tkinter.StringVar() 
     Info3 = tkinter.Label(self, textvariable=self.labelVariableInfo3, anchor = 'e') 
     Info3.grid(column=2, row=0, sticky='EW') 
     self.labelVariableInfo3.set("Actions:") 

     self.labelVariableInfo4 = tkinter.StringVar() 
     Info4 = tkinter.Label(self, textvariable=self.labelVariableInfo4, anchor = 'w') 
     Info4.grid(column=3, row=0, sticky='EW') 
     self.labelVariableInfo4.set(Actions) 

     self.labelVariableInfo5 = tkinter.StringVar() 
     Info5 = tkinter.Label(self, textvariable=self.labelVariableInfo5, anchor = 'e') 
     Info5.grid(column=12, row=0, sticky='EW') 
     self.labelVariableInfo5.set("Day") 

     self.labelVariableInfo6 = tkinter.StringVar() 
     Info6 = tkinter.Label(self, textvariable=self.labelVariableInfo6, anchor = 'w') 
     Info6.grid(column=13, row=0, sticky='EW') 
     self.labelVariableInfo6.set(Day) 

     if Stage == 0: 

      LabelClear = tkinter.Label(self) 
      LabelClear.grid(column=4, row=1, columnspan=10, sticky='EW') 

      WorkButton1 = tkinter.Button(self, text=u"Beg", command=self.Beg) 
      WorkButton1.grid(column=0, row=1, columnspan=2, sticky='NESW') 

      SleepButton = tkinter.Button(self, text=u"Sleep", command=self.Sleep) 
      SleepButton.grid(column=2, row=1, columnspan=2, sticky='NESW') 

     if Stage >= 1: 

      #Border Section 
      self.labelVariableCutOff = tkinter.StringVar() 
      CutOff = tkinter.Label(self, textvariable=self.labelVariableCutOff) 
      CutOff.grid(column=0, row=1, columnspan=14, sticky='NESW') 
      self.labelVariableCutOff.set("+--------------------------------------------------------------+-------------------------------------+") 

      self.labelVariableBorder = tkinter.StringVar() 
      Border1 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border1.grid(column=0, row=2, sticky='W') 
      self.labelVariableBorder.set(" | ") 

      Border2 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border2.grid(column=13, row=2, sticky='E') 

      Border3 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border3.grid(column=0, row=3, sticky='W') 

      Border4 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border4.grid(column=13, row=3, sticky='E') 

      Border5 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border5.grid(column=0, row=4, sticky='W') 

      Border6 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border6.grid(column=13, row=4, sticky='E') 

      Border7 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border7.grid(column=0, row=5, sticky='W') 

      Border8 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border8.grid(column=13, row=5, sticky='E') 

      Border9 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border9.grid(column=0, row=6, sticky='W') 

      Border10 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border10.grid(column=13, row=6, sticky='E') 

      Border11 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border11.grid(column=0, row=7, sticky='W') 

      Border12 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border12.grid(column=13, row=7, sticky='E') 

      Border13 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border13.grid(column=0, row=8, sticky='W') 

      Border14 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border14.grid(column=13, row=8, sticky='E') 

      CutOff2 = tkinter.Label(self, textvariable=self.labelVariableCutOff) 
      CutOff2.grid(column=0, row=9, columnspan=14, sticky='NESW') 

      Border15 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border15.grid(column=0, row=10, sticky='W') 

      Border16 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border16.grid(column=13, row=10, sticky='E') 

      Border17 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border17.grid(column=0, row=11, sticky='W') 

      Border18 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border18.grid(column=13, row=11, sticky='E') 

      Border19 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border19.grid(column=0, row=12, sticky='W') 

      Border20 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border20.grid(column=13, row=12, sticky='E') 

      Border21 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border21.grid(column=0, row=13, sticky='W') 

      Border22 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border22.grid(column=13, row=13, sticky='E') 

      Border23 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border23.grid(column=0, row=14, sticky='W') 

      Border24 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border24.grid(column=13, row=14, sticky='E') 

      Border25 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border25.grid(column=7, row=2, sticky='E') 

      Border26 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border26.grid(column=7, row=3, sticky='E') 

      Border27 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border27.grid(column=7, row=4, sticky='E') 

      Border27 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border27.grid(column=7, row=5, sticky='E') 

      Border28 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border28.grid(column=7, row=6, sticky='E') 

      Border29 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border29.grid(column=7, row=7, sticky='E') 

      Border30 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border30.grid(column=7, row=8, sticky='E') 

      Border31 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border31.grid(column=7, row=10, sticky='E') 

      Border32 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border32.grid(column=7, row=11, sticky='E') 

      Border33 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border33.grid(column=7, row=12, sticky='E') 

      Border34 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border34.grid(column=7, row=13, sticky='E') 

      Border35 = tkinter.Label(self, textvariable=self.labelVariableBorder) 
      Border35.grid(column=7, row=14, sticky='E') 

      CutOff3 = tkinter.Label(self, textvariable=self.labelVariableCutOff) 
      CutOff3.grid(column=0, row=15, columnspan=14, sticky='NESW') 

      #Advanced Information Labels (Functional but not Fully Implemented) 
      self.labelVariableWork1 = tkinter.StringVar() 
      Work1 = tkinter.Label(self, textvariable=self.labelVariableWork1, anchor='e', fg='black') 
      Work1.grid(column=9, row=3, columnspan=3, sticky='EW') 
      self.labelVariableWork1.set("Metal:") 

      self.labelVariableWork2 = tkinter.StringVar() 
      Work2 = tkinter.Label(self, textvariable=self.labelVariableWork2, anchor='w', fg='black') 
      Work2.grid(column=12, row=3, sticky='EW') 
      self.labelVariableWork2.set(Metal) 

      self.labelVariableWork3 = tkinter.StringVar() 
      Work3 = tkinter.Label(self, textvariable=self.labelVariableWork3, anchor='e', fg='black') 
      Work3.grid(column=9, row=4, columnspan=3, sticky='EW') 
      self.labelVariableWork3.set("Type:") 

      self.labelVariableWork4 = tkinter.StringVar() 
      Work4 = tkinter.Label(self, textvariable=self.labelVariableWork4, anchor='w', fg='black') 
      Work4.grid(column=12, row=4, sticky='EW') 
      self.labelVariableWork4.set(Type) 

      self.labelVariableWork5 = tkinter.StringVar() 
      Work5 = tkinter.Label(self, textvariable=self.labelVariableWork5, anchor='e', fg='black') 
      Work5.grid(column=9, row=5, columnspan=3, sticky='EW') 
      self.labelVariableWork5.set("Forming:") 

      self.labelVariableWork6 = tkinter.StringVar() 
      Work6 = tkinter.Label(self, textvariable=self.labelVariableWork6, anchor='w', fg='black') 
      Work6.grid(column=12, row=5, sticky='EW') 
      self.labelVariableWork6.set("{0}%".format(FormLevel)) 

      self.labelVariableWork7 = tkinter.StringVar() 
      Work7 = tkinter.Label(self, textvariable=self.labelVariableWork7, anchor='e', fg='black') 
      Work7.grid(column=9, row=6, columnspan=3, sticky='EW') 
      self.labelVariableWork7.set("Hardening:") 

      self.labelVariableWork8 = tkinter.StringVar() 
      Work8 = tkinter.Label(self, textvariable=self.labelVariableWork8, anchor='w', fg='black') 
      Work8.grid(column=12, row=6, sticky='EW') 
      self.labelVariableWork8.set("{0}%".format(Hardness)) 

      self.labelVariableWork9 = tkinter.StringVar() 
      Work9 = tkinter.Label(self, textvariable=self.labelVariableWork9, anchor='e', fg='black') 
      Work9.grid(column=9, row=7, columnspan=3, sticky='EW') 
      self.labelVariableWork9.set("Sharpening:") 

      self.labelVariableWork10 = tkinter.StringVar() 
      Work10 = tkinter.Label(self, textvariable=self.labelVariableWork10, anchor='w', fg='black') 
      Work10.grid(column=12, row=7, sticky='EW') 
      self.labelVariableWork10.set("{0}%".format(Sharpness)) 

      #Label that is meant to be next to the menu 
      Label1 = tkinter.Label(self, text="Buy:", anchor='e') 
      Label1.grid(column=1, row=2, sticky='EW') 

      #The Latest version of my unworking menu code 
      '''BuyMenu = tkinter.Menu() 
      Menu1 = tkinter.MenuButton(menu=BuyMenu) 
      BuyMenu.add_cascade(label="Choose Metal", menu=BuyMenu) 
      BuyMenu.add_command(label="Copper C: 15", command=self.BuyCopper) 
      BuyMenu.add_command(label="Iron C: 25", command=self.BuyIron) 
      Menu1.grid(column=2, row=2, sticky='EW')''' 

      #Resource Information 
      Info7 = tkinter.Label(self, text="Copper:", anchor='e') 
      Info7.grid(column=1, row=3, sticky='EW') 

      self.labelVariableResource1 = tkinter.StringVar() 
      Resource1 = tkinter.Label(self, textvariable=self.labelVariableResource1, anchor='w') 
      Resource1.grid(column=2, row=3, sticky='EW') 
      self.labelVariableResource1.set(Copper) 

      Info8 = tkinter.Label(self, text="Iron:", anchor='e') 
      Info8.grid(column=1, row=4, sticky='EW') 

      self.labelVariableResource2 = tkinter.StringVar() 
      Resource1 = tkinter.Label(self, textvariable=self.labelVariableResource2, anchor='w') 
      Resource1.grid(column=2, row=4, sticky='EW') 
      self.labelVariableResource2.set(Iron) 



    #Stage 0 Commands 
    def Beg(self): 
     global Actions 
     global Coins 

     if Actions != 0: 
      Actions -= 1 
      Coins += 1 
      Bonus = randrange(1,6) 
      if Bonus == 5: 
       Coins +=1 
      self.labelVariableInfo2.set(Coins) 
      self.labelVariableInfo4.set(Actions) 

    def Sleep(self): 

     global Day 
     global Coins 

     Day += 1 

     if Stage == 0: 
      Coins -= 2 
      DarkLabel = tkinter.Label(self, bg='black') 
      DarkLabel.grid(column=0, row=0, columnspan=14, rowspan=2, sticky='NESW') 
      self.after(5000, lambda: DarkLabel.destroy()) 
     if Day == 5: 
      self.after(5000, lambda: self.Story1()) 
      Coins += 50 
     else: 
      self.after(5000, lambda: self.New_Day()) 


    #Story Section 2 
    def Story1(self): 

     global Stage 

     self.labelVariableInfo5.set("") 
     self.labelVariableInfo6.set("") 

     self.labelVariableStory1 = tkinter.StringVar() 
     Story1 = tkinter.Label(self, textvariable=self.labelVariableStory1, anchor = 'w') 
     Story1.grid(column=0, row=0, columnspan=4, sticky='EW') 
     self.labelVariableStory1.set("On the fifth day an old man comes up to you.") 

     self.labelVariableStory2 = tkinter.StringVar() 
     Story2 = tkinter.Label(self, textvariable=self.labelVariableStory2, anchor = 'w') 
     Story2.grid(column=0, row=1, columnspan=4, sticky='NESW') 
     self.labelVariableStory2.set("'It pains me to see a young person in need.'") 

     self.labelVariableStory3 = tkinter.StringVar() 
     Story3 = tkinter.Label(self, textvariable=self.labelVariableStory3, anchor = 'w') 
     Story3.grid(column=0, row=2, columnspan=4, sticky='EW') 
     self.labelVariableStory3.set("'I'm almost at the end of my days and I have no children.'") 

     self.labelVariableStory4 = tkinter.StringVar() 
     Story4 = tkinter.Label(self, textvariable=self.labelVariableStory4, anchor = 'w') 
     Story4.grid(column=0, row=3, columnspan=4, sticky='EW') 
     self.labelVariableStory4.set("'I will teach you all I can and leave you my forge.'") 


     Story1.after(15000, lambda: Story1.destroy()) 
     Story2.after(15000, lambda: Story2.destroy()) 
     Story3.after(15000, lambda: Story3.destroy()) 
     Story4.after(15000, lambda: Story4.destroy()) 

     Stage += 1 
     self.after(15000, lambda: self.New_Day()) 

    #Stage 1 Commands (These are to be triggered by the menu) 
    def BuyCopper(self): 
     global Coins 
     global Copper 
     if Coins >= 15: 
      Coins -= 15 
      Copper += 1 
      self.labelVariableInfo2.set(Coins) 
      self.labelVariableResource1.set(Copper) 

    def BuyIron(self): 
     global Coins 
     global Iron 
     if Coins >= 25: 
      Coins -= 25 
      Iron += 1 
      self.labelVariableInfo2.set(Coins) 
      self.labelVariableResource2.set(Iron) 







#GUI loop 
if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('Smithy') 
    app.mainloop() 

Теперь я включил весь свой код, за исключением комментирования моего кода нерабочего меню.

+0

вы пытаетесь использовать метод сетки поместить виджеты ли? Если да, можете ли вы показать фрагмент кода, используя его? –

+0

Вы хотите мои попытки в меню или в других виджетах? Потому что у меня много других виджетов. –

+0

Пока я не получу ответ, я собираюсь просто добавить бит рядом с областью, в которой я хочу, чтобы меню было размещено в –

ответ

0

Вам понадобится option menu или ComboBox. Это меню, но на странице не в верхней части экрана.

Вот код для добавления параметров в OptionMenu:

from Tkinter import * 

root=Tk() 
def change(value): 
    options.append("YOUR_OPTION_HERE") 
    menu=drop["menu"] 
    menu.delete("0", END) 
    for string in options: 
     menu.add_command(label=string, command=lambda value=string: var.set(value)) 

options=["hello", "goodbye", "welcome"] 
var=StringVar() 
drop=OptionMenu(root, var, *options, command=change) 
drop.config(width=15) 
drop.pack() 
root.mainloop() 
+0

Спасибо, что мне нужно, однако я хотел бы знать, как добавить к это с большим количеством переменных на более позднем этапе. Например, если в какой-то момент мне нужны два варианта, но после выполнения чего-то я добавлю еще два, как бы я это сделал? –