2017-01-15 1 views
-1

Я пытаюсь заполнить 2 спинбоксами с разными значениями из одного текстового файла (file.txt). Я управляю этим путем поиска «баннеров» (TITLE) в файле и заполнения каждого из значений между двумя указанными баннерами.Как я могу индексировать по строке в спинке, а не по номеру символа?

'file.txt' будет что-то вроде этого:

(без дополнительных символов новой строки)

............ #exactly 12 в соответствии с шаблонами в код

TITLE 1

............

первая вещь

вторая вещь

............

TITLE 2

............

первичной

вторичный

............

НАЗВАНИЕ 3

............

from tkinter import * 
import tkinter as tk 
import re 

root = Tk() 

class Main(): 

    def __init__(self, root): 
     pass 

    def Thing1(): 
     read_thing = open('file.txt', 'r') 
     read_names = read_thing.read() 
     print (read_names) 
     pattern3 =r'^(............)$\ 
    ^(TITLE 1)$\ 
    ^(............)$' 
     pattern4 = r'^(............)$\ 
    ^(TITLE 2)$\ 
    ^(............)$' 
     multiline3 = re.compile(pattern3, re.MULTILINE) 
     multiline4 = re.compile(pattern4, re.MULTILINE) 
     for match in multiline3.finditer(read_names): 
      s=match.start() 
      e=match.end() 
     for match in multiline4.finditer(read_names): 
      s1=match.start() 
      e1=match.end() 
      output = (read_names[e: s1]) 
      print (output) 
      return output 

    def Thing2(): 
     read_thing = open('file.txt', 'r') 
     read_names = read_thing.read() 
     print (read_names) 
     pattern4 =r'^(............)$\ 
    ^(TITLE 2)$\ 
    ^(............)$' 
     pattern5 = r'^(............)$\ 
    ^(TITLE 3)$\ 
    ^(............)$' 
     multiline4 = re.compile(pattern4, re.MULTILINE) 
     multiline5 = re.compile(pattern5, re.MULTILINE) 
     for match in multiline4.finditer(read_names): 
      s=match.start() 
      e=match.end() 
     for match in multiline5.finditer(read_names): 
      s1=match.start() 
      e1=match.end() 
      output = (read_names[e: s1]) 
      print (output) 
      return output 

    values1 = Main.Thing1() 
    values2 = Main.Thing2() 

    def sb1_changed(): 
     selected = var1.get() 
     idx = values1.index(selected) 
     print('selected:', selected) 
     print('index', idx) 
     var2.set(values2[idx]) 

    def sb2_changed(): 
     selected = var2.get() 
     idx = values2.index(selected) 
     print('selected:', selected) 
     print('index', idx) 
     var1.set(values1[idx]) 

var1 = tk.StringVar() 
var2 = tk.StringVar() 

spinbox1=tk.Spinbox(self, textvariable=var1, values=values1, 
            command=sb1_changed) 
spinbox1.pack() 
spinbox2=tk.Spinbox(self, textvariable=var2, values=values2, 
            command=sb2_changed) 
spinbox2.pack() 

root.mainloop() 

Идея с sb1_changed и sb2_changed является то, что, как я прокрутки и, следовательно, выбрать различные значения в 1 со счётчиком, я также должен быть одновременно прокрутки различные значения в другой спинбонке.

Однако, что на самом деле происходит, что прокрутка через один из спинбокс делает, прокручивая другую, но я могу видеть только отдельные символы, а не целые слова. Таким образом, кажется, что индекс соответствует номерам символов, а не линиям. Как я могу заставить его соответствовать строкам?

+0

Создайте простой рабочий пример, чтобы запустить его. – furas

+0

Это рабочий пример, который запускается. С предыдущим комментарием (теперь удаленным) вы, казалось, указывали на мою проблему. У тебя есть решение? Пример моей проблемы может помочь: если у меня есть «первый» в sb1 и «primary» в sb2 в качестве начальных значений, прокрутка через sb1 дает мне первый индексный символ sb2, то есть: «p». Как я могу заставить его дать мне «первичную»? – MarkyMark

+0

не работает пример - я не могу просто скопировать-вставить его запустить.Вы помещаете только некоторый класс и Spinboxes, но этого недостаточно для его запуска. – furas

ответ

1

Проблема в том, что Thing1() и Thing2() возвращают Everthing в одну строку и spinbox ожидает список - так что вы должны преобразовать эту строку в список

return output.strip().split() 

код (после некоторых модификаций), которые я использую

import tkinter as tk 
import re 

def thing(patternA, patternB): 
    read_thing = open('file.txt', 'r') 
    read_names = read_thing.read() 

    print(read_names) 

    multilineA = re.compile(patternA, re.MULTILINE) 
    multilineB = re.compile(patternB, re.MULTILINE) 

    for match in multilineA.finditer(read_names): 
     s = match.start() 
     e = match.end() 
     print('[DEBUG] s,e:', s, e) 

    for match in multilineB.finditer(read_names): 
     s1 = match.start() 
     e1 = match.end() 
     print('[DEBUG] s1,e1:', s1, e1) 
     output = read_names[e: s1] 
     print('[DEBUG] output:', output) 
     return output.strip().split("\n") 

def thing1(): 
    pattern3 =r'^(............)$\ 
^(TITLE 1)$\ 
^(............)$' 
    pattern4 = r'^(............)$\ 
^(TITLE 2)$\ 
^(............)$' 

    return thing(pattern3, pattern4) 

def thing2(): 
    pattern4 =r'^(............)$\ 
^(TITLE 2)$\ 
^(............)$' 
    pattern5 = r'^(............)$\ 
^(TITLE 3)$\ 
^(............)$' 

    return thing(pattern4, pattern5) 

def sb1_changed(): 
    selected = var1.get() 
    idx = values1.index(selected) 
    print('selected:', selected) 
    print('index', idx) 
    var2.set(values2[idx]) 

def sb2_changed(): 
    selected = var2.get() 
    idx = values2.index(selected) 
    print('selected:', selected) 
    print('index', idx) 
    var1.set(values1[idx]) 

# --- main --- 

values1 = thing1() 
values2 = thing2() 

print('[DEBUG] values1:', values1) 
print('[DEBUG] values2:', values2) 

root = tk.Tk() 

var1 = tk.StringVar() 
var2 = tk.StringVar() 

spinbox1 = tk.Spinbox(root, textvariable=var1, values=values1, 
            command=sb1_changed) 
spinbox1.pack() 

spinbox2 = tk.Spinbox(root, textvariable=var2, values=values2, 
            command=sb2_changed) 
spinbox2.pack() 

root.mainloop() 

И file.txt для испытания

AA  01 
AA  02 
AA  03 
AA  04 
AA  05 
TITLE 1 
BB  01 
BB  02 
BB  03 
BB  04 
BB  05 
TITLE 2 
CC  01 
CC  02 
CC  03 
CC  04 
CC  05 
TITLE 3 
DD  01 
DD  02 
DD  03 
DD  04 
DD  05 
TITLE 4 
EE  01 
EE  02 
EE  03 
EE  04 
EE  05 
+0

Я изменил 'thing1' и' thing2', потому что они делают почти то же самое. – furas

+0

Я изменил '.split()' в '.split (" \ n ")' и использовал новый 'file.txt' с пробелами. – furas